Про обработку ошибок

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Про обработку ошибок

Сообщение XairOn » 15.06.2005 (Ср) 17:13

Здравствуйте... вопрос мой такой: все мы знаем оператор: On Error Resume Next (вернее событие и оператор), так вот, бля обработки ошибок нужно это строку всавлять в каждую подпрограмму, а можно ли как-нибудь глобально это сделать, т.е. не в каждой процедуре это всё писать, а для всей программы? Я вот думаю, а может через АПИ как-нибудь можно!?

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

Сообщение RayShade » 15.06.2005 (Ср) 17:14

Нельзя.

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

Re: Про обработку ошибок

Сообщение tyomitch » 15.06.2005 (Ср) 17:39

XairOn писал(а):так вот, бля обработки ошибок

Мат на форуме! :!: :lol:
Изображение

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 15.06.2005 (Ср) 20:10

tyomitch писал(а):Мат на форуме!

Я вообще-то наверное просто торопился и не заметил ошибку... хотел написать ДЛЯ... а получилось... ну сам знаешь...

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 15.06.2005 (Ср) 22:55

2 RayShade

Ну как же?! А эти отладчики? Тот же Invisible Bug Debuger?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Re ///

Сообщение xenomorph » 15.06.2005 (Ср) 23:59

2XairOn:

Можно, но немного не так 8-).

Метод простой:

1. Юзать анализатор кода для втыкания On Error Goto M0
... он их автоматически вставляет в код - т.е. автоматизирует процесс 8-).

Метод непростой, а золотой.

SEH.
Structural Exception Handler.
Классная статья на www.wasm.ru ///
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 16.06.2005 (Чт) 0:56

я за такие программы сразу всякие интимные места бы отрезал. Это чтож получается, не программа, а одна сплошная ошибка? Нда... Где вас программировать учат...
ХЎ

Rostik Ultra (2)
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 159
Зарегистрирован: 10.05.2005 (Вт) 2:41
Откуда: Антарктическая республика

Сообщение Rostik Ultra (2) » 16.06.2005 (Чт) 1:51

d3drm писал(а):я за такие программы сразу всякие интимные места бы отрезал. Это чтож получается, не программа, а одна сплошная ошибка? Нда... Где вас программировать учат...


А ты типа крутой кул програмер ?
Мой сайт http://mentalprograms.narod.ru/ - бесплатные развивающие программы

MeMBus
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 450
Зарегистрирован: 23.02.2005 (Ср) 7:03
Откуда: Из леса...

Сообщение MeMBus » 16.06.2005 (Чт) 3:25

d3drm, прав. Если затыкать всю прогу с помощью проги которая поставляет везде on error resume next, то получиться что програмер сам не знает что он хочет написать. Предвидеть ошибки нужно там где они явно могут возникнуть (к примеру, при открытии файла), а обработчик on error resume next подходит тока в том случае если ошибка может быть не явной и не кретичной для работы программы.
Бороться и искать, найти и перепрятать!

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

re ...

Сообщение xenomorph » 16.06.2005 (Чт) 8:02

На ВБ Стритсах уже был разговор насчёт
прог аддонов к ВБ ...
AxTools CodeSMART 2005 for VB6
- между прочем, был посоветован то ли Tyomitch-ем то
ли xolod-ом ...

Я его уже 1 год юзаю и не жалею.
Код стайлер там - просто незаменим когда работаешь на
РАК-е ...

Схемы обработок ошибок там очень хорошие и разные.

> Это чтож получается, не программа,
> а одна сплошная ошибка?

ИМХО:

1. ВБ это и есть "одна сплошная ошибка"
(отставить помидоры 8-) - я имею ввиду следующее ... :
2. On Error ... - просто вставляет SEH на уровень локальной
процедуры.
3. У ВБ свой глобальный SEH на который и вылетает
любая на ВБ написаная прога при крит. ерроре.
т.е. у ТАК работает:

Устанавливает seh и делает "обратную раскрутку стека" ...

==================покусано с: www.WASM.ru========================
Тип 1 – финальный обработчик исключений

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

Установка финального обработчика исключений

Обычно, он устанавливается в первичном потоке, как можно ближе к
точке входа программы, вызовом API-функции SetUnhandledExceptionFilter.
Таким образом, он защищает всю программу от этой точки и до конца.
Нет никакой необходимости удалять обработчик перед завершением,
т.к. это автоматически сделает сама Windows.

Пример:

MAIN:;Точка входа в программу.
PUSH OFFSET FINAL_HANDLER
CALL SetUnhandledExceptionFilter
; ...
; ...;Код защищенный финальным обработчиком.
; ...
CALL ExitProcess
;****************
FINAL_HANDLER:
; ...
; ... ;Код, обеспечивающий корректный выход.
; ...
MOV EAX,1 ;Возможные возвращаемые значения и их описание:
;eax=-1 перезагрузить контекст и продолжить выполнение программы.
;eax= 1 не показывать сообщение о предстоящем закрытии программы.
;eax= 0 показывать сообщение о предстоящем закрытии программы.
RET

Не пытайтесь сформировать цепочку из финальных обработчиков исключений

В любой момент времени, в процессе может быть только один, определенный
приложением, финальный обработчик исключений. Если ваш код вызывает
во второй раз функцию SetUnhandledExceptionFilter, то адрес финального
обработчика исключений просто меняется на новое значение, а
предыдущий теряется.
==================покусано с: www.WASM.ru========================
тока на ВБ я этого не делал 8).
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

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

Сообщение ANDLL » 16.06.2005 (Чт) 9:38

И не сделаешь. Даю десять против девяти, что у ВБ свои механизмы отловки исключений. Соответственно единственные исключения, которые ты сможешь отлавливать - это memory exceptions, вызванные Rtl-функциями. Хотя сам факт наличия этих исключений означает, что твоя программа содержит семантическую(смысловую) ошибку. Соответственно тот факт, что ты это исключение поймаешь абсалютно ничего тебе не даст...
И вообще искдючения VB и исключения виндовс имеют мало общего.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 16.06.2005 (Чт) 9:42

ANDLL, ты не прав. VB использует именно SEH для реализации своих исключений.
Изображение

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

Сообщение ANDLL » 16.06.2005 (Чт) 9:49

Да? Ну ладно. Выходит можно поставить глобальный обработчик?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение ANDLL » 16.06.2005 (Чт) 9:58

2tyomitch:
Что-то я не заметил:
Код: Выделить всё
SetUnhandledExceptionFilter AddressOf Exception
'RaiseException &H10, 50, 1, VarPtr(nArgs(0))
Err.Raise -155

В RaiseException все нормально... А вот Err.Raise выдает Automation error. Стандартный.

Видимо я опять чего-то не понимаю :(
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 16.06.2005 (Чт) 10:36

ANDLL, под средой или компилировал? (Сейчас проверить самому времени нет)
Изображение

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

Сообщение ANDLL » 16.06.2005 (Чт) 12:40

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

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

Сообщение ANDLL » 16.06.2005 (Чт) 13:07

Во, Темыч!
Оказывается, вот, что надо было использовать:
Код: Выделить всё
AddVectoredExceptionHandler -1, AddressOf Exception
'...
Public Function Exception(ByVal a As Long) As Long
MsgBox a
ExitProcess a
End Function
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение ANDLL » 16.06.2005 (Чт) 13:26

Кстати, кто нибудь мне объяснит эту странную весчь?
Код: Выделить всё
'В модуле
Option Explicit

Public Type EXCEPTION_RECORD
    ExceptionCode As Long 'Код исключения
    ExceptionFlags As Long 'Флаги исключения
    pExceptionRecord As Long 'Хрен его знает
    ExceptionAddress As Long 'Адрес, по которому произошло исключение
    NumberParameters As Long 'Колчиество параметров
    pExceptionInformation As Long 'Собственно параметры
End Type

Public Type EXCEPTION_POINTERS
    pExceptionRecord As Long
    pContextRecord As Long
End Type

Public Declare Sub RaiseException Lib "kernel32" (ByVal dwExceptionCode As Long, ByVal dwExceptionFlags As Long, ByVal nNumberOfArguments As Long, ByVal lpArguments As Long)
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
Public Declare Function AddVectoredExceptionHandler Lib "kernel32" (ByVal aPosition As Long, ByVal aAddress As Long) As Long
Public Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)
Public Const EXCEPTION_CONTINUE_EXECUTION = -1
Public Const EXCEPTION_CONTINUE_SEARCH = 0

Public Function Exception(ByRef ptr As EXCEPTION_POINTERS) As Long
    Dim nRecord As EXCEPTION_RECORD
    CopyMemory VarPtr(nRecord), ptr.pExceptionRecord, Len(nRecord)
    MsgBox "Исключение!" & vbCrLf & _
        "Код: " & nRecord.ExceptionCode & vbCrLf & _
        "Флаги: " & nRecord.ExceptionFlags & vbCrLf & _
        "Кол-во параметров:" & nRecord.NumberParameters _
        , vbCritical, "Ошибка"
    'Dim nErr As ErrObject
    'CopyMemory VarPtr(nErr), nRecord.pExceptionInformation + 4, 4
    MsgBox Hex(nRecord.pExceptionInformation)
    Exception = EXCEPTION_CONTINUE_SEARCH 'Мы можем или завершить процесс, используя ExitProcess или продожить поиск. Мы не можем возобновить выполнение программы
End Function

Код: Выделить всё
'В форме
Private Sub Form_Load()
Dim nArgs(0) As String
nArgs(0) = "AAA"
AddVectoredExceptionHandler -1, AddressOf Exception
Err.Raise -155
End
End Sub

Запустите, и посмейтесь :lol:
Посмеялись? А теперь объясните мне, куда указывает nRecord.pExceptionInformation?
Запускать, ясное дело, в скомпилированном варианте.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 16.06.2005 (Чт) 21:00

Запустил, весело посмеялся.
Run-time error '453':

Can't find DLL entry point AddVectoredExceptionHandler in kernel32

Её нету в Win2000, только в WinXP.

ANDLL писал(а):А теперь объясните мне, куда указывает nRecord.pExceptionInformation?

MSDN писал(а):ExceptionInformation
Specifies an array of additional 32-bit arguments that describe the exception. The RaiseException function can specify this array of arguments. For most exception codes, the array elements are undefined.

Или не так?
Изображение

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

Сообщение ANDLL » 17.06.2005 (Пт) 8:31

Ну, скажем так. Если бы у тебя был WinXP, ты увидел бы, что nRecord.pExceptionInformation=&HDEADCAFE. Вот и куда оно указывает?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 17.06.2005 (Пт) 10:16

ANDLL писал(а):Ну, скажем так. Если бы у тебя был WinXP, ты увидел бы, что nRecord.pExceptionInformation=&HDEADCAFE. Вот и куда оно указывает?

Как куда, в Фолаут :lol:

Вот это мне кажется похожим на Err::Raise
Код: Выделить всё
push    ebp
mov     ebp,esp
push    ecx
push    ecx
mov     eax,0DEADCAFEh
mov     [ebp-8],eax
mov     [ebp-4],eax
lea     eax,[ebp-8]
push    eax
push    2
push    1
push    0C000008Fh
call    dword ptr [RaiseException]

По-моему, таким образом (два DEADCAFE подряд) MSVBVM отличает собственные исключения от чужих.

Кто б научил с символами работать - был бы несказанно благодарен. А то чего я как лох - сижу с msvbvm60.dbg и гадаю - то ли Err::Raise, то ли хз что...
Изображение

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 17.06.2005 (Пт) 13:05

2 tyomitch

Что-то не нашел тему где ты спрашивал об этих символах :( поэтому вот информация:

Статья:
Возможности встроенного отладчика Visual C++
Это с форума:
Отладочные символы

Re[2]: Отладочные символы (.DBG, .PDB)

Re: Установка symbols под Win2K

Посмотри в поиске на rsdn.ru
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.06.2005 (Пт) 13:14

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

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 17.06.2005 (Пт) 14:18

когда символы загружены в отладчике пишет что для модуля такого символы лоадед. А потом в трассировке пишет не просто "имя модуля"."адрес функции", а "имя модуля"."имя функции", по моему все.
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

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

Сообщение tyomitch » 17.06.2005 (Пт) 20:00

Загружаются не только имена функций, но ещё меток, переменных, и номера параметров для FPO-функций. В общем, много всего интересного.

Я уже почти расковырял свой DBG руками, может тулзу какую напишу, которая будет символы в disassembly вставлять. Если кому-то ещё это интересно - расскажу и покажу, что там как :-)


ЗЫ: я нашёл, что VC5+ не могут работать с символами в формате COFF, коие содержатся в моём DBG, и что я должен либо юзать "альтернативные отладчики" (назвали WinDbg и OllyDbg, которые якобы умеют работать с COFF, но я так и не разобрался как этого добиться), либо выбросить DBG и попросить у автора бинарника PDB :roll:

ЗЗЫ: а вот ещё я нашёл symcvt.dll, которая якобы может сконвертировать мой DBG в PDB... Кто-нибудь знает как? Гугл - нет :-(
Изображение

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

Сообщение ANDLL » 17.06.2005 (Пт) 20:48

tyomitch, мне интересно как. Только с самого начала и для "самых маленьких" :oops: :) .
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 17.06.2005 (Пт) 21:04

ANDLL, тогда давай аську... Был бы нормальный чат - обсудили бы в чате :-(
Изображение

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

Сообщение ANDLL » 18.06.2005 (Сб) 8:37

Щас, заведу...
Кстати, Темыч, адреса kernel'овских API-функций в какой-то сеанс работы ОС одинаковые для всех процессов?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение ANDLL » 18.06.2005 (Сб) 9:03

И еще: jecxz(в отличие от jmp) выполняет переход только по абсолютному адресу. Как же быть, если нужно перейти по относительному(когда абсолютный адрес не известен на этапе разработки)?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 23.06.2005 (Чт) 20:43

Ну наконец-то добрался, отвечу :-)
1. Да. У всех системных библиотек (не только kernel32), подгружаемых в ехешник при его загрузке (т.е. прописанных в его импортах), база будет одна и та же (не для сеанса, а для этого билда Винды вообще).
Если библиотека подгружается динамически - тогда база может быть нестандартной. Интересный философский вопрос: как динамически подгрузить krenel32? :lol:

2. jecxz выполняет переход только по относительному адресу, т.ч. я не понял, чего тебе нехватает. Но в любом случае её можно заменить парой команд or ecx,ecx; jz
Изображение

След.

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

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

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

    TopList