Обработка ошибок в VB6

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

Обработка ошибок в VB6

Сообщение visitor » 01.03.2009 (Вс) 14:00

Я не большой спец в механизме обработки исключений, всю жизнь мечтал в ВБ6 иметь возможность в одном месте написать что-то типа
Код: Выделить всё
try{App.Run()}
catch()...

Можно ли достичь такого эффека в ВБ ?

Пробовал в класее звпустить свой цикл обработки сообщений
Код: Выделить всё
Public Function Run() As Long
  Dim xmsg As MSG
  Dim bRet As Long
  On Error GoTo ErrH
    bRet = GetMessage(xmsg, 0, 0, 0)
    Do While ((bRet))
      If bRet = -1 Then
        MsgBox "fatal error -1", vbCritical
      Else
        TranslateMessage xmsg
        DispatchMessage xmsg
      End If
      bRet = GetMessage(xmsg, 0, 0, 0)
    Loop
  GoTo FnEx
ErrH:
  MsgBox "Error encounted " + vbCrLf + CStr(Err.Number) + " " + Err.Description
  Resume Next
FnEx:
End Function

Не получаю нужного эффекта..Подскажите. посоветуйте. пожалуйста.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Обработка ошибок в VB6

Сообщение Хакер » 01.03.2009 (Вс) 14:50

Молодец, но причём тут MessageLoop?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

visitor
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 08.10.2008 (Ср) 1:52

Re: Обработка ошибок в VB6

Сообщение visitor » 01.03.2009 (Вс) 15:11

Хакер писал(а):Молодец, но причём тут MessageLoop?

Это хоть как-то похоже на ответ на мой вопрос, или дополнительный вопрос с целью ответить на вопрос, или на намек на ответ?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Обработка ошибок в VB6

Сообщение Хакер » 01.03.2009 (Вс) 15:27

Это хоть как-то похоже на ответ на мой вопрос, или дополнительный вопрос с целью ответить на вопрос, или на намек на ответ?

Это вопрос, причиной задания которого было желание получить ответ на тему того, по какой причине в первом сообщении упоминается Message pumping loop, потому как первое сообщение, содержащее это упоминание, навело на мысль о возможном непонимании каких-то моментов, о вероятно сложившимся у автора темы ошибочном убеждении о наличии какой-то связи между обработкой исключений и обработкой очереди оконных сообщений, потому как подобная связь очевидно отсутствует, и упоминание MPL в вопросе об exception handling кажется странным.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

visitor
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 08.10.2008 (Ср) 1:52

Re: Обработка ошибок в VB6

Сообщение visitor » 01.03.2009 (Вс) 15:37

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

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Re: Обработка ошибок в VB6

Сообщение Zenitchik » 01.03.2009 (Вс) 20:43

ЕМНИП, это не так. Но я могу ошибаться.
Если администрация не возражает, я задам в этой теме еще два вопроса:
1. Как заставить ошибку "всплывать" в вызывающую процедуру?
2. Как сделать это с генерируемой Err.Raise ошибкой?
Знание английского языка - затрудняет понимание кода

visitor
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 08.10.2008 (Ср) 1:52

Re: Обработка ошибок в VB6

Сообщение visitor » 01.03.2009 (Вс) 21:06

Позволю себе дописать еще пару подвопросов:
Мне интересна разница On Error и On Local Error
Влияет ли на механизм обработки ошибок в скомпилированной программе выбор режима в Tools->Options->General->Error trapping
Если можно кто что знает, распишите максимально понятно
Заранее спасибо !

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

Re: Обработка ошибок в VB6

Сообщение tyomitch » 01.03.2009 (Вс) 21:31

Zenitchik писал(а):1. Как заставить ошибку "всплывать" в вызывающую процедуру?
2. Как сделать это с генерируемой Err.Raise ошибкой?

On Error GoTo 0

visitor писал(а):Влияет ли на механизм обработки ошибок в скомпилированной программе выбор режима в Tools->Options->General->Error trapping

Нет
Изображение

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

Re: Обработка ошибок в VB6

Сообщение tyomitch » 01.03.2009 (Вс) 21:33

visitor писал(а):по моему мнению on error обрабатывает ошибки в текущей процедуре и во всех вложенных.

Верно.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Обработка ошибок в VB6

Сообщение ANDLL » 01.03.2009 (Вс) 21:39

Оконная функция, которую вызывает DispatchMessage содержит в себе обработчик исключений, который завершает программу.
Именно поэтому перехватат ошибок, который ожидает автор, не происходит
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Re: Обработка ошибок в VB6

Сообщение Zenitchik » 01.03.2009 (Вс) 23:19

Позвольте, разве On Error GoTo 0 не отменяет юзерскую обработку ошибок вообще?
Тогда при возникновении ошибки произойдет остановка выполнения. А мне нужно, чтобы прервано было только выполнение текущей процедуры, и сработал обработчик уровнем выше.
Знание английского языка - затрудняет понимание кода

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Обработка ошибок в VB6

Сообщение ANDLL » 01.03.2009 (Вс) 23:33

Нет, не отменяет обработку вообще. Отменяет обработку в текущей процедуре
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Re: Обработка ошибок в VB6

Сообщение Zenitchik » 05.03.2009 (Чт) 18:59

Т.е. обработчик в вызывающей процедуре ошибку перехватит?

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

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Обработка ошибок в VB6

Сообщение ANDLL » 05.03.2009 (Чт) 20:25

err.raise
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Re: Обработка ошибок в VB6

Сообщение Zenitchik » 05.03.2009 (Чт) 21:47

А логика работы?
Я вызываю Err.Raise. Если обработчика нет - это мне никакого толку не даст.
Если обработчик в вызывающей процедуре - он ее перхватывает, так?

А что нужно предпринять, чтобы узнать источник ошибки? Кстати, как вообще после отмены нумерации строк получают источник ошибки?
Знание английского языка - затрудняет понимание кода

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Обработка ошибок в VB6

Сообщение ANDLL » 05.03.2009 (Чт) 22:17

Вообще error handling в VB это огромная ж-па.
Более того, error handling - самый серьезный минус VB6 перед хорошими ЯП.
Номер строки можно указать. Если номер указан, он сохраняется в объекте ошибки, если не указан - никак не узнать.
Stack Trace никак не получить. Как либо фильтровать ошибки то же нельзя.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Re: Обработка ошибок в VB6

Сообщение alibek » 05.03.2009 (Чт) 22:35

ANDLL писал(а):Вообще error handling в VB это огромная ж-па.
Более того, error handling - самый серьезный минус VB6 перед хорошими ЯП.

Это да. Тяжелое наследие древнего BASIC.
Поэтому для более-менее нормальной обработки ошибок приходится сочинять свою сложную систему кодов ошибок плюс добавлять пяток глобальных переменных плюс класс-коллекцию для стека и отслеживания состояний. Эти действия, конечно, можно автоматизировать с помощью аддонов, но все-равно они остаются кривыми костылями. После try...catch остается только вздыхать и мириться с on error.

Лично я стараюсь обходится только on error resume next (с анализом ошибок сразу после мест их возможного возникновения), либо используя аргумент ByRef ErrorCode/ErrorMessage в вызываемой процедуре, который возвратит код/описание ошибки. Это не так правильно, но зато куда проще.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Обработка ошибок в VB6

Сообщение Хакер » 05.03.2009 (Чт) 22:43

А что общественность хочет?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Re: Обработка ошибок в VB6

Сообщение Zenitchik » 06.03.2009 (Пт) 22:53

Хм... Следовательно, ничего умнее зашифровывания данных о месте генерации ошибки в ее номер и описание не придумать?

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

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Обработка ошибок в VB6

Сообщение Debugger » 06.03.2009 (Пт) 23:14

Хакер писал(а):А что общественность хочет?

Может это можно исправить при помощи аддона?
(а потом добавим гибкую поддержку типов, то, се, другое, третье, и в итоге получим новый Си :) )

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Обработка ошибок в VB6

Сообщение Хакер » 06.03.2009 (Пт) 23:31

Вопрос был в том, каким общественность хочет видеть механизм обработки ошибок. Это просто дискуссионный вопрос, а не экспресс-опрос мнений перед тем как броситься за написание эддина.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

visitor
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 08.10.2008 (Ср) 1:52

Re: Обработка ошибок в VB6

Сообщение visitor » 09.03.2009 (Пн) 12:26

Хочется в основном получить возможность избавится от стандартного обработчика ошибок, заменив его своим...
Как минимум чтоб иметь возможность реализовать что-то вроде Send Report to developer... Стек вызовов и тп - уже мечта конечно
----
Хотя я сегодня от квип инфиум получил сообщение о недостатке прав на создание файла, так там помимо стека вызовов куча всего красивого в репорте есть, даже дизассембли точки останова... писано на делфи... Канкуренты блин :mrgreen:
----
[добавлено]
к стати, что думаете по этому поводу ?? стоит попробовать ?
http://www.rsdn.ru/article/baseserv/except.xml


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 53

    TopList