Подскажите как организовать обработчик ошибок.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
VisMajor
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 04.10.2002 (Пт) 10:42

Подскажите как организовать обработчик ошибок.

Сообщение VisMajor » 05.04.2003 (Сб) 16:29

Вобщем я не знаю даже с чего начать. А так достало что при возникновении ошибок приложение закрывается...

DimPos
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 15.11.2002 (Пт) 17:24
Откуда: Киров

Сообщение DimPos » 05.04.2003 (Сб) 18:02

Конечно многое зависит от ошибки, но в общем случае
Sub()
On Error Goto Err
'Код процедуры
Exit sub'если ошибок не было - выход из процедуры
Err:
'Сюда включаешь свой обработчик ошибки
MsgBox "Ошибка"
End Sub

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 07.04.2003 (Пн) 9:20

Если ошибка защиты Виндовс, то ищи SetErrorHandler - работает, сам проверял
Последний раз редактировалось Sebas 07.04.2003 (Пн) 9:22, всего редактировалось 1 раз.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 07.04.2003 (Пн) 9:28

Да. Мелкософт под это дело ставит окошко с предложением послать код ошибки. Вещь позитивная, можно использовать в приложениях.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

VisMajor
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 04.10.2002 (Пт) 10:42

Сообщение VisMajor » 07.04.2003 (Пн) 16:40

DimPos писал(а):Конечно многое зависит от ошибки, но в общем случае
Sub()
On Error Goto Err
'Код процедуры
Exit sub'если ошибок не было - выход из процедуры
Err:
'Сюда включаешь свой обработчик ошибки
MsgBox "Ошибка"
End Sub


А нельзяли сделать одну процедуру, которая будет срабатывать при возникновении ошибки... :oops:

А то ведь у меня уже в проге в целом 7000 строк- сдохну покуды переделаю... :evil:

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 07.04.2003 (Пн) 16:44

Есть выход - можно обрабатывать ошибки только в главной процедуре, которая вызывает все остальные. Для этого, правда, придется вохможно, немного переделать структуру программы, но это того стоит - дело в том, что все возхникающие ошиюки из процедур передаются на уровень, откуда эти процедуры вызваны.

Так что в таком случае достаточно будет одной процедуры с обработкой.

VisMajor
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 04.10.2002 (Пт) 10:42

Сообщение VisMajor » 07.04.2003 (Пн) 18:39

RayShade писал(а):Есть выход - можно обрабатывать ошибки только в главной процедуре, которая вызывает все остальные. Для этого, правда, придется вохможно, немного переделать структуру программы, но это того стоит - дело в том, что все возхникающие ошиюки из процедур передаются на уровень, откуда эти процедуры вызваны.
Так что в таком случае достаточно будет одной процедуры с обработкой.


А можно ли кодом показать? Пожалуйста. :D

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 07.04.2003 (Пн) 18:44

sub mysub1()

open "myfile" for input as #1

end sub



sub mysub2()

print #1, "AAAA"

muysub3

end sub



sub mysub3()

close#1

end sub



sub main

on error goto hdl

mysub1

mysub2

exit sub

hdl:

msgbox "Error " & err.description

end sub



ну так примерно. Вызывающая суба будет перехватывать ошибки из дочерних.

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 07.04.2003 (Пн) 20:12

sub main
on error goto hdl
mysub1
mysub2
exit sub
hdl:
msgbox "Error " & err.description
end sub

Ты помоему mysub3 забыл.... 8) :D
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

VisMajor
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 04.10.2002 (Пт) 10:42

Сообщение VisMajor » 07.04.2003 (Пн) 21:40

RayShade писал(а):
ну так примерно. Вызывающая суба будет перехватывать ошибки из дочерних.


Спасибо, попробую использовать. :idea:

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 08.04.2003 (Вт) 10:12

2 FAKK читай внимательно, она вызывается из mysub1 :lol:

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 08.04.2003 (Вт) 10:51

вся же хэндлеры не забывайте!
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 23.02.2006 (Чт) 21:14

Встала такая же проблема. Кода мульен, а обработчиков кот наплакал.
Хотелось бы уточнить на что обратить внимание при создании обработчиков в коренных процедурах?

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 23.02.2006 (Чт) 21:56

Pantalone
Обработчиков каких ошибок?
Типа "Приложение совершило ошибку и будет закрыто" или стандартных ВБшных? :)
P.S. Некрофилия твоя профессия похоже =)
Если всё делать своими ручками, они скоро отвалятся !

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 23.02.2006 (Чт) 22:12

Kovu
Стандартных видимо.

zafon
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 04.07.2003 (Пт) 4:48
Откуда: AKKO,Israel

Сообщение zafon » 23.02.2006 (Чт) 22:39

А помоему даже и лутше что прога загибается и не даёт продолжать работать. Ведь дальнейшее продолжение работы програмы после ошибки может привести к непредвиденым результатам , а порой к катострофическим последствиям :shock: . :!:

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 23.02.2006 (Чт) 22:47

zafon
Но надо же как-то от юзера получить где и когда прога сглючила.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.02.2006 (Чт) 22:51

zafon писал(а):Ведь дальнейшее продолжение работы програмы после ошибки может привести к непредвиденым результатам , а порой к катострофическим последствиям :shock: . :!:

Какой ужас!!!
А ты когда-нибудь сохранял данные на дискету?
Про ошибку 71 знаешь?
Lasciate ogni speranza, voi ch'entrate.

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 24.02.2006 (Пт) 0:00

Короче сам буду обработчик делать, кода слишком много, доверять его колбасить сомнительным утилитам не дам.
Посоветуйте только Адд-Ин, позволяющий вставить в начале функции/процедуры строчку On Erro Goto Handler, а в конце функции Exit Function/Sub, саму метку, и код который я задам в шаблоне, обязательно чтобы она в этом коде добавляла имя обрабатываемой функции. Т.е. выглядеть вставляемое должно так:

Код: Выделить всё
Sub Test()
On Error GoTo Handler

'...........
'...........
'...........

Exit Sub
Handler:
   
    Call MySpecialErrorLogSub("Test", Err.Number, Err.Description)

End Sub

Function TestNew()
On Error GoTo Handler

'...........
'...........
'...........

Exit Function
Handler:
   
    Call MySpecialErrorLogSub("TestNew", Err.Number, Err.Description)

End Function


Причем чтобы никакой отсебятины, чтобы само это не вставлялось во все процедуры, только по моему желанию - зашел, нажал кнопку - поставилось именно в этой процедуре и нигде больше.

zafon
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 04.07.2003 (Пт) 4:48
Откуда: AKKO,Israel

Сообщение zafon » 24.02.2006 (Пт) 0:57

Да, можно и так .
Можно в добавок писать в error_log_file с отсылкой от юзверя к тебе на мыло!:wink: (Просто мысль влух!)

zafon
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 04.07.2003 (Пт) 4:48
Откуда: AKKO,Israel

Сообщение zafon » 24.02.2006 (Пт) 2:49

Вот работает :

Код: Выделить всё

Dim NameSubError as String

Public Sub ShowError()
Open App.Path & "\error_log.txt" For Append As #999
Print #999, Date & " | " & Time & " - " & " Sub  '" & NameSubError & "'  ( " & CStr(Err.Number) & " - " & Err.Description & " ) ."
Close #999
Dim Ret As Integer
Ret = MsgBox("My Program ERROR : " & vbCrLf & CStr(Err.Number) & " - " & Err.Description & "." & vbCrLf & "End Program. Sorry...", vbOKOnly + vbCritical + vbApplicationModal, "Error in Sub- '" & NameSubError & "'")
End
End Sub

Private Sub MySub1()
On Error Goto ShowMesage
'..........

'My Code.....
'.......... 
Exit Sub
ShowMesage:
NameSubError ="MySub1"
Call ShowError
End Sub

Private Sub MySub2()
On Error Goto ShowMesage
'..........

'My Code.....
'.......... 
Exit Sub
ShowMesage:
NameSubError ="MySub2"
Call ShowError
End Sub

Private Sub MySub3()
On Error Goto ShowMesage
'..........

'My Code.....
'.......... 
Exit Sub
ShowMesage:
NameSubError ="MySub3"
Call ShowError
End Sub


В "error_log.txt" будет записано:

2/24/2006 | 01:29:18 - Sub 'Form_Load' ( 70 - Permission denied ) .
2/24/2006 | 01:29:18 - Sub 'NewJob' ( 401 - Can't show non-modal form when modal form is displayed ) .

2 Pantalone:
Если я правельно тебя понял - это ты хотел.

AjaxVS
Постоялец
Постоялец
 
Сообщения: 506
Зарегистрирован: 01.12.2004 (Ср) 13:12
Откуда: Donetsk, Battle.Net

Сообщение AjaxVS » 24.02.2006 (Пт) 3:32

Так что в таком случае достаточно будет одной процедуры с обработкой.

Если только в проекте нет форм =) Только тогда не надо будет обрабатывать ошибки, возникающие при событиях.
Ведь дальнейшее продолжение работы програмы после ошибки может привести к непредвиденым результатам , а порой к катострофическим последствиям.

"Дискета защищена от записи" ... катострофа! +_+

Насчет "On Error"... Важно!
Смотрите, чтобы не было у вас в программе чего-то типа этого:
Код: Выделить всё
Sub fun_gluk()
On Error Rusume Next
For i=1 to 2
'какой-то код
Next
'дальше можно не писать

Просто в IDE VB все будет ОК, но вот в скомпилированном EXE "какой-то код" будет выполнятся бесконечно...

Насчет одной обработки на все функции:
Я уже говорил (давно правда), что гораздо легче написать свою прогу, которая автоматически вставляла бы после строки, начинающейся "Sub"/"Function" код "On Error...", а перед строкой "End Sub"/"End Function" - вставляла бы нужный вам обработчик...

Дело пяти минут...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.02.2006 (Пт) 9:53

Pantalone писал(а):Посоветуйте только Адд-Ин, позволяющий вставить в начале функции/процедуры строчку On Erro Goto Handler, а в конце функции Exit Function/Sub, саму метку, и код который я задам в шаблоне, обязательно чтобы она в этом коде добавляла имя обрабатываемой функции.

http://bbs.vbstreets.ru/viewtopic.php?t=11863
http://bbs.vbstreets.ru/viewtopic.php?t=12615
Изображение

xfolder
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 133
Зарегистрирован: 22.07.2002 (Пн) 18:57
Откуда: United Kingdom

Сообщение xfolder » 24.02.2006 (Пт) 13:28

я делаю проще, прописываю в каждую процедуру всего 3 строчки в самом начале, так гораздо проще отслеживать где есть перехват ошибок и где забыл прописать.

Private Sub Form_Load()

On Error GoTo EH: GoTo jump
EH: ErrorHandler 1, "Select_date: Form_Load", Err.Description, Err.Number: Exit Sub
jump:


.......

end sub

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 24.02.2006 (Пт) 16:30

Кто-нибудь пользуется HuntERR? Нашел в описании интересную мульку, там можно в лог передавать аргументы функции, т.е. имена параметров и их значения. Насколько надежно все это работает, как бы наоборот еще больше глюков не появилось :)

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 24.02.2006 (Пт) 17:32

Да, этот HuntERR совершенно убойная вещь, разобраться бы как ее автоматом встроить :)

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 24.02.2006 (Пт) 21:47

MZTools + HuntERR = MustHave!

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 25.02.2006 (Сб) 1:51

Тока код распух, чистый экзешник за мег перевалил, надо отметить :)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot], Yandex-бот и гости: 29

    TopList