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

Тема в разделе "WASM.ASSEMBLER", создана пользователем GoldFinch, 8 ноя 2008.

  1. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    я сейчас для ловли ошибок использую следующий код:
    SomeApi(...)
    test eax,eax
    jz __exit_err
    ...
    __exit_err:
    GetLastError()
    FormatMessageA(0x00001300,0,eax,0,Temp,0,0)
    MessageBoxA(0,[Temp],0,0)
    ExitProcess(0)

    а если вместо "jz __exit_err" писать int3 и ловить эксепшн в SEH, это нормальное решение, или с ним что-то не так?

    преимущество такого способа в том что не используется глобальная метка, поэтому лучше переносимость кода, etc
     
  2. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    не вижу связи. Я бы не придумывал проблемы которой нет, а писал "call error".
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    связь в том что библиотечный модуль не должен требовать от главного модуля наличия в нем каких-либо глобальных меток, а плодить свои процедуры error в каждом модуле тоже неправильно
     
  4. PE_Kill

    PE_Kill New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    107
    GoldFinch не вполне нормально это когда модуль не имеет своего обработчика ошибок. Фигли юзай тогда UnhandledExceptionFilter и не парься.
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Почему?
    А плодить обработчики SEH с тем же самым кодом правильно? в чём разница?
    Имхо своя метка error в модуле удобна тем, что можно к стандартному сообщению добавить уточняющую информацию об имени модуля строке с ошибкой и т.п. и никаких недостатков метки по сравнению с seh не вижу.
     
  6. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Не, необязательно SEH, он просто для примера. Речь о том чтобы генерить эксепшн вместо перехода на метку.
    А SEH-обработчик выводящий сообщение конечно тоже должен быть 1, иначе в самом деле, какой смысл.
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    :)))
    Лично мне идея замены функции на исключение не нравится, хотя M$ даже при работе с Heap предусматривает режим исключения вместо возврата кода ошибки.
     
  8. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    GoldFinch
    приведенный код не является кодом _обработки_ ошибки. это скорее похоже на хрюк свиньи заживо смываемой в унитаз :derisive: например, если ты записываешь что-то во временный файл, а места на диске уже нет, то можно создать файл на другом томе или попросить пользователя стереть все ненужное. аналогично, если ты выделяешь N байт под буфер работы с файлом, а памяти нет, то можно либо сократить N в несколько раз, либо освободить другие некритичные буфера, либо же выделить буфер в стеке. это и называется обработкой ошибки. универсальных обработчиков не существует и они тесно связаны с контекстом окружения. в частности, буфер под обработку файла (поиск строки, скажем) с легкостью допускает уменьшение размера без переделки алгоритма, но если нам нужно отсортировать массив и функция сортировки ожидает указателя на блок памяти, а столько памяти у нас нету, то, конечно, возможно, отсортировать массив частями, но ценой существенного усложнения алгоритма.

    ну а пример приведенный тобой действительно лучше реализовать через call чего-то-там. причем, это что-то может быть реализовано в соседнем модуле.
     
  9. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    GoldFinch, а как ты собираешься вызвать int 3 без метки. или ты думал, что это прокатит
    Код (Text):
    1. call SomeAPI
    2. int 3
    к тому же можно один раз написать обработчик метки __exit_err и вызывать его как библиотечную фунцию из другого модуля, а SEH так не поймаешь - убъют! не вижу смысла дергать попусту исключения. собственно это и вводилось дабы разгрузить обработчик исключений (слишком долго в него вываливается и пытаться понять что же случилось).
     
  10. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Api(...)
    test eax,eax
    jnz @f
    int3
    @@:
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Исключения конечно хорошо, но вопрос зачем. В этом ещё есть какой-то смысл для библиотеки (и то большой вопрос). Для кидания исключений в свой же код, смысла не вижу.
     
  12. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    GoldFinch
    аналогично
    Код (Text):
    1. Api(...)
    2. test eax,eax
    3. jnz @f
    4. call error_handler
    5. @@:
    или что еще короче
    Код (Text):
    1. Api(...)
    2. test eax,eax
    3. jnz error_handler
    а SEH оставь в покое, он существует для внутренних "аппаратно-системных" исключений!