Как перехватывать фатальные ошибки
От: MT  
Дата: 18.11.03 11:03
Оценка:
Можно ли перехватить фатальные ошибки вроде "Memory could not be read"?
Пробовал так:

  try {

  } catch (...) { 

  }


Но очевидно что не все ошибки перехватываются...
Быстрее, лучше, дешевле — выбери любые два.
(Старая инженерная поговорка)
Re: Как перехватывать фатальные ошибки
От: Vamp Россия  
Дата: 18.11.03 11:05
Оценка:
MT>Но очевидно что не все ошибки перехватываются...
Далеко не все фатальные ошибки являются С++ исключениями.
Да здравствует мыло душистое и веревка пушистая.
Re: Как перехватывать фатальные ошибки
От: Аноним  
Дата: 18.11.03 11:09
Оценка: 1 (1)
Здравствуйте, MT, Вы писали:


Пробуй так:

MT>
 __try {

} __except (...) { 

}
Re[2]: Как перехватывать фатальные ошибки
От: MT  
Дата: 18.11.03 11:10
Оценка:
Здравствуйте, Vamp, Вы писали:

MT>>Но очевидно что не все ошибки перехватываются...

V>Далеко не все фатальные ошибки являются С++ исключениями.


Т.е. является ошибкой уровня ОС (неперехватываемая)?

Как с ними бороться — писать проги без ошибок, использовать "IF" ?
Быстрее, лучше, дешевле — выбери любые два.
(Старая инженерная поговорка)
Re[2]: Как перехватывать фатальные ошибки
От: MT  
Дата: 18.11.03 11:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, MT, Вы писали:



А>Пробуй так:


MT>>
А> __try {

А>} __except (...) { 

А>}
А>


Какой хедер-фаил надо включить в программу для __try/__except?
Быстрее, лучше, дешевле — выбери любые два.
(Старая инженерная поговорка)
Re[3]: Как перехватывать фатальные ошибки
От: Vamp Россия  
Дата: 18.11.03 11:20
Оценка:
MT>Т.е. является ошибкой уровня ОС (неперехватываемая)?
А что ты вообще понимаешь под фатальной ошибкой уровня ОС?
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Как перехватывать фатальные ошибки
От: Lorenzo_LAMAS  
Дата: 18.11.03 11:23
Оценка:
никакого
Of course, the code must be complete enough to compile and link.
Re[4]: Как перехватывать фатальные ошибки
От: MT  
Дата: 18.11.03 11:23
Оценка:
Здравствуйте, Vamp, Вы писали:

MT>>Т.е. является ошибкой уровня ОС (неперехватываемая)?

V>А что ты вообще понимаешь под фатальной ошибкой уровня ОС?

Ошибки "memory couldn't be read/accessed" — бывают часто, но как перехватить?
try/catch(...) не перехватывает.
Быстрее, лучше, дешевле — выбери любые два.
(Старая инженерная поговорка)
Re: Как перехватывать фатальные ошибки
От: _Obelisk_ Россия http://www.ibm.com
Дата: 18.11.03 11:28
Оценка: 5 (2) +1
Здравствуйте, MT, Вы писали:

MT>Можно ли перехватить фатальные ошибки вроде "Memory could not be read"?



Использовать что-то типа Purify и активней применять smart pointer-ы.

Такие ошибки надо не перехватывать, а фиксить.



Душа обязана трудиться! (с) Н.Заболоцкий.
Re[3]: Как перехватывать фатальные ошибки
От: SergeMukhin Россия  
Дата: 18.11.03 11:30
Оценка: 1 (1)
Здравствуйте, MT, Вы писали:

MT>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, MT, Вы писали:



А>>Пробуй так:


MT>>>
А>> __try {

А>>} __except (...) { 

А>>}
А>>


MT>Какой хедер-фаил надо включить в программу для __try/__except?



для MS — никакой, но почитай сначала про SEH и его взаимодействие с CPP исключениями.
... << RSDN@Home 1.1.0 stable >>
---
С уважением,
Сергей Мухин
Re: Как перехватывать фатальные ошибки
От: Аноним  
Дата: 18.11.03 11:36
Оценка:
MT>Можно ли перехватить фатальные ошибки вроде "Memory could not be read"?

А unexpected() тоже не помогает?
Re[2]: Как перехватывать фатальные ошибки
От: MT  
Дата: 18.11.03 11:45
Оценка:
Здравствуйте, Аноним, Вы писали:

MT>>Можно ли перехватить фатальные ошибки вроде "Memory could not be read"?


А>А unexpected() тоже не помогает?


Нет, не помогает
Быстрее, лучше, дешевле — выбери любые два.
(Старая инженерная поговорка)
Re: Как перехватывать фатальные ошибки
От: Аноним  
Дата: 18.11.03 11:46
Оценка: 2 (1)
Здравствуйте, MT, Вы писали:

MT>Можно ли перехватить фатальные ошибки вроде "Memory could not be read"?

[]
MT>Но очевидно что не все ошибки перехватываются...

У Микрософта есть такая странная функция под названием _set_se_translator (см. в MSDN), которая позволяет преобразовывать структурное исключение Windows (см. SEH) в исключение C++.
Re[2]: Как перехватывать фатальные ошибки
От: Дмитрий Наумов  
Дата: 18.11.03 11:49
Оценка:
Здравствуйте, Аноним, Вы писали:

MT>>Можно ли перехватить фатальные ошибки вроде "Memory could not be read"?


А>А unexpected() тоже не помогает?


Не в тему. SEH, без определенных телодвижений, не отмаплен в C++ исключения.
Re[2]: Как перехватывать фатальные ошибки
От: Lorenzo_LAMAS  
Дата: 18.11.03 11:49
Оценка:
А>А unexpected() тоже не помогает?

А как она тут должна была помочь?
Of course, the code must be complete enough to compile and link.
Re[5]: Как перехватывать фатальные ошибки
От: Vamp Россия  
Дата: 18.11.03 11:53
Оценка: +1
V>>А что ты вообще понимаешь под фатальной ошибкой уровня ОС?

MT>Ошибки "memory couldn't be read/accessed" — бывают часто, но как перехватить?


Их не должно быть вовсе. Это значит, ты не туда обращаешься в памяти. Следи за указателями.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Как перехватывать фатальные ошибки
От: SergeMukhin Россия  
Дата: 18.11.03 12:00
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, MT, Вы писали:


MT>>Можно ли перехватить фатальные ошибки вроде "Memory could not be read"?

А>[]
MT>>Но очевидно что не все ошибки перехватываются...

А>У Микрософта есть такая странная функция под названием _set_se_translator (см. в MSDN), которая позволяет преобразовывать структурное исключение Windows (см. SEH) в исключение C++.



мы пользуемся SetUnhandledExceptionFilter — он практически все перехватывает, но у нас своя обработка ошибок, а так много статей есть и, в том числе в MSDN, о внутренностях SEH и как его подружить с CPP.
... << RSDN@Home 1.1.0 stable >>
---
С уважением,
Сергей Мухин
Re: Как перехватывать фатальные ошибки
От: Дмитрий Наумов  
Дата: 18.11.03 12:34
Оценка:
Здравствуйте, MT, Вы писали:

Сделай примерно так

#define MapSehToCppExeption  _set_se_translator(SEH::TranslateSehToCExeption);


class ERRSPEC SEH: public EXCEPTION
{
  public:

    //Оператор возврата кода исключения
    operator unsigned long();
  
    //Контекст процессора
    CONTEXT          mContext;
    // hook-функция
    static void _cdecl TranslateSehToCExeption(UINT ,EXCEPTION_POINTERS* pep);

  private:
    //Конструктор для создания объекта SEH при возникновении исключения
    SEH(PEXCEPTION_POINTERS pep);

    static char* GetSehMsg(SEH& e,char* s);
    EXCEPTION_RECORD mEr;    
  
};
Как перехватывать фатальные ошибки
От: Шахтер Интернет  
Дата: 19.11.03 01:49
Оценка: 144 (21) -1
#Имя: FAQ.vc.seh
Здравствуйте, MT, Вы писали:

MT>Можно ли перехватить фатальные ошибки вроде "Memory could not be read"?

MT>Пробовал так:

MT>
MT>  try {

MT>  } catch (...) { 

MT>  }
MT>


MT>Но очевидно что не все ошибки перехватываются...


Рассказываю (и показываю). То что вы называете фатальными ошибками на самом деле являются SEH-исключениями операционной системы (внимательно читаем Рихтера). Они возбуждаются в различных ситуациях, как то: доступ по неправильному адресу, переполнение стека, деление на нуль, ошибка сопроцессора и.т.д. Будучи неперехваченным, SEH-исключение вызывает появление хорошо известного окна с предложением впаять разработчику и принудительной остановки процесса. Как перехватывать такие исключения в C++. Метод __try __except обсуждать не буду, поскольку его использование в C++ программах -- это дурной тон и возможный конфликт с родными C++ исключениями. Наиболее простой подход -- использовать catch(...). Для того, чтобы это работало, необходимо правильно настоить компилятор. Насчет VC++ 6.0 не помню, а вот в 7.0/7.1 придётся повыделываться. Заходим на вкладочку свойств проекта C/C++ Code Generation. Там есть строчка Enable C++ exception. Смело ставим в этой строчке No. Дальше двигаемся в конец к секции Command Line. На соотвествующей вкладочке есть окошко, Additional Options. Вот здесь надо прописать /EHac. Почему так, спросите у Билла Гейтса. Чтобы жизнь была интересней и разнообразней, наверное. Не всё ж галочки в property tab мышкой переключать. В чем недостаток этого подхода -- невозможно определить тип исключения, и ,что более серьёзно, возникают проблемы с плавающей арифметикой. Имеется более усовершенствованный метод. Заключается он в использовании так называемого se транслятора. Вот примерный код.


#include <eh.h>

static void se_translator(unsigned int code,_EXCEPTION_POINTERS *)
 {
  if( code==EXCEPTION_FLT_DENORMAL_OPERAND   ||
      code==EXCEPTION_FLT_DIVIDE_BY_ZERO     ||
      code==EXCEPTION_FLT_INEXACT_RESULT     ||
      code==EXCEPTION_FLT_INVALID_OPERATION  ||
      code==EXCEPTION_FLT_OVERFLOW           ||
      code==EXCEPTION_FLT_STACK_CHECK        ||
      code==EXCEPTION_FLT_UNDERFLOW
    )
    {
     short cw=???;        
        
     __asm { 
              fninit 
              fldcw  cw
           }
    }

  throw Exception(CPUError(code));
 }
 
void Setup_SE_translator()
 {
  _set_se_translator(se_translator);
 }


Смысл в следующем. Вызовом функции _set_se_translator можно инсталировать функцию, которая будет получать управление в случае возникновения в текущем потоке SEH-исключения. Главное назначение этой функции -- получить код SEH-исключения, завернуть в подходящую обёртку и выбросить нормальное C++ исключение. Которое в дальнейшем можно поймать обычным catch. Коды этих исключений можно получить из windows.h, а описание -- в MSDN в статье про EXCEPTION_RECORD. Среди этих кодов есть семейство особо важных, связанных с плавающей точкой. При получении одного из этих кодов, надо делать маленькую дополнительную обработку. А именно, нужно командой fninit сбросить сопроцессор в нормальное состояние. Ну и загрузить подходящее слово управление. Иначе флаги исключений по-прежнему будут висеть в сопроцессоре, что вызовет возбуждение нового исключения при попытке его снова заюзать. Вообще, использование исключений сопроцессора -- это отдельный нетривиальный вопрос. Поскольку с ним связан целый рад фокусов, на которые можно напороться.
... << RSDN@Home 1.1 beta 2 >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[2]: Как перехватывать фатальные ошибки
От: Sergey_BG Россия  
Дата: 08.02.05 12:47
Оценка:
Здравствуйте, Шахтер, Вы писали:

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


А интересно где нибудь можно по подробней про это почитать?
Сергей
Re[2]: Как перехватывать фатальные ошибки
От: Irokez  
Дата: 08.02.05 14:28
Оценка:
А set_unexpected — не подайдет, для обработки "неуловимых" исключений
Re[2]: Как перехватывать фатальные ошибки
От: Вадим Никулин Россия Здесь
Дата: 08.02.05 14:42
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Вот здесь надо прописать /EHac. Почему так, спросите у Билла Гейтса. Чтобы жизнь была интересней и разнообразней, наверное. Не всё ж галочки в property tab мышкой переключать.


Во-первых, мне кажется, что нужно выставлять /EHa. Вот, что говорит MSDN:
Use /EHa to specify the asynchronous exception handling model (C++ exception handling with structured exception handling exceptions).

Во-вторых, в VS8.0 контора Mr. Gates'а все-таки вынесла эту опцию на флажок.
Re[3]: Как перехватывать фатальные ошибки
От: Sergey_BG Россия  
Дата: 08.02.05 14:52
Оценка:
На текущий момент написал

                __except( GetExceptionCode() == EXCEPTION_FLT_INVALID_OPERATION)
                {
                    _clear87();   // сбросить бузи и ексцепт
                    _fpreset();   // чтоб стек еррор не возникал

                    init_fpe_masks(); // установить заново маски прерываний

                    return def;   // вернуть значение по умолчанию
                }


интересно как это правильно написать, а не как я сам сочинил
Сергей
Re[3]: Как перехватывать фатальные ошибки
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 08.02.05 15:01
Оценка:
Здравствуйте, Sergey_BG, Вы писали:

S_B>А интересно где нибудь можно по подробней про это почитать?


http://gzip.rsdn.ru/article/baseserv/except.xml
Автор(ы): Беляев Алексей
Дата: 25.09.2004
В статье приводится пример того, как получить управление в случае фатальной ошибки приложения, чтобы произвести ”предсмертные” действия.

?
Re[3]: Как перехватывать фатальные ошибки
От: Шахтер Интернет  
Дата: 09.02.05 03:26
Оценка:
Здравствуйте, Вадим Никулин, Вы писали:

ВН>Здравствуйте, Шахтер, Вы писали:


Ш>>Вот здесь надо прописать /EHac. Почему так, спросите у Билла Гейтса. Чтобы жизнь была интересней и разнообразней, наверное. Не всё ж галочки в property tab мышкой переключать.


ВН>Во-первых, мне кажется, что нужно выставлять /EHa. Вот, что говорит MSDN:

ВН>Use /EHa to specify the asynchronous exception handling model (C++ exception handling with structured exception handling exceptions).

Это не противоречит тому, что я написал. Вот полная статья из MSDN.

/EH{s|a}[c][-]

This option specifies the model of exception handling to be used by the compiler.

Use /EHs to specify the synchronous exception handling model (C++ exception handling without structured exception handling exceptions). If you use /EHs, do not rely on the compiler to catch asynchronous exceptions.

Use /EHa to specify the asynchronous exception handling model (C++ exception handling with structured exception handling exceptions).

The /EHc option requires that /EHs, /EHa, or /GX is specified. It tells the compiler to assume that extern C functions never throw an exception.

The option can be cleared by the symbol -. For example, /EHsc- is interpreted as /EHs /EHc-, and is equivalent to /EHs.


В большинстве случаев, можно предположить, что C-функции исключений не выбрасывают. Задав опцию /EHc можно несколько ускорить код. Естественно, если вы предполагаете, что некоторые C-функции в вашем приложении могут выбросить исключение, например потому, что вы передаёте им в качестве параметров указатель, который может быть не валидным, то использовать этот флаг не стоит. Хотя на мой вкус, данный подход при проектировании приложений контрпродуктивен.

ВН>Во-вторых, в VS8.0 контора Mr. Gates'а все-таки вынесла эту опцию на флажок.


Слава богу. Не прошло и ста лет...
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[3]: Как перехватывать фатальные ошибки
От: Шахтер Интернет  
Дата: 09.02.05 03:26
Оценка:
Здравствуйте, Irokez, Вы писали:

I>А set_unexpected — не подайдет, для обработки "неуловимых" исключений


Не понял смысла ответа.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[3]: Как перехватывать фатальные ошибки
От: Шахтер Интернет  
Дата: 09.02.05 03:26
Оценка:
Здравствуйте, Sergey_BG, Вы писали:

S_B>Здравствуйте, Шахтер, Вы писали:


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


S_B>А интересно где нибудь можно по подробней про это почитать?


По сопроцессору -- документацию Intel. А как использовать их в конкретных задачах -- я сомневаюсь, что об этом можно что-то прочитать толковое. Не встречал. В 99,9% люди просто не знают или не задумываются об использовании мало-мальски нетривиальных свойств плавающей арифметики.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: Как перехватывать фатальные ошибки
От: Tom Россия http://www.RSDN.ru
Дата: 17.11.05 21:12
Оценка:
MT>>Можно ли перехватить фатальные ошибки вроде "Memory could not be read"?
Один нюанс, нужно иметь ввиду, что для одно и того же исключения эта функция может быть вызвана боллее одного раза, важно это скажем при логировании исключений.
Народная мудрось
всем все никому ничего(с).
Re[2]: Как перехватывать фатальные ошибки
От: Cyberax Марс  
Дата: 18.11.05 04:29
Оценка:
Tom wrote:

> MT>>Можно ли перехватить *фатальные ошибки вроде "Memory could not be

> read"*?
> Один нюанс, нужно иметь ввиду, что для одно и того же исключения эта
> функция может быть вызвана боллее одного раза, важно это скажем при
> логировании исключений.

Портабельно — никак. Для Windows можно использовать SEH (см.
SetUnhandledExceptionFilter), для POSIX'ов можно перехватывать SIGSEGV.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re: Как перехватывать фатальные ошибки
От: _Winnie Россия C++.freerun
Дата: 18.11.05 06:51
Оценка: 4 (1)
Здравствуйте, Шахтер, Вы писали:


Ш>Здравствуйте, MT, Вы писали:остановки процесса. Как перехватывать такие исключения в C++. Метод __try __except обсуждать не буду, поскольку его использование в C++ программах -- это дурной тон и возможный конфликт с родными C++ исключениями. Наиболее простой подход -- использовать catch(...). Для того, чтобы это работало, необходимо правильно настоить компилятор. Насчет VC++ 6.0 не помню, а вот в 7.0/7.1 придётся повыделываться. Заходим на вкладочку свойств проекта C/C++ Code Generation. Там есть строчка Enable C++ exception. Смело ставим в этой строчке No. Дальше двигаемся в конец к секции Command Line. На соотвествующей вкладочке есть окошко, Additional Options. Вот здесь надо прописать /EHac.


Поставил тебе хорошую оценку за туториал по _set_se_retranslator и минус( ) за "дурной тон" и /EHac.

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

И почему "дурной тон"? У нас это ловится на самом верху в функции WinMain, там делается минидамп стека и предлагается отправить письмо в поддержку (ну и еще в сугубо системном коде написанном на "С++ без классов", практически на С) Что здесь "дурного" ?

Как раз _set_se_retranslator — это дурной тон, поскольку создаёт иллюзию у начинающего программиста, что после обработки исключения программа осталась в определённом состоянии. Нет, если уж выкинуто SEH, надо забыть про С++ и начать игру по другим правилам.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: Как перехватывать фатальные ошибки
От: Шахтер Интернет  
Дата: 18.11.05 10:40
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Здравствуйте, Шахтер, Вы писали:



Ш>>Здравствуйте, MT, Вы писали:остановки процесса. Как перехватывать такие исключения в C++. Метод __try __except обсуждать не буду, поскольку его использование в C++ программах -- это дурной тон и возможный конфликт с родными C++ исключениями. Наиболее простой подход -- использовать catch(...). Для того, чтобы это работало, необходимо правильно настоить компилятор. Насчет VC++ 6.0 не помню, а вот в 7.0/7.1 придётся повыделываться. Заходим на вкладочку свойств проекта C/C++ Code Generation. Там есть строчка Enable C++ exception. Смело ставим в этой строчке No. Дальше двигаемся в конец к секции Command Line. На соотвествующей вкладочке есть окошко, Additional Options. Вот здесь надо прописать /EHac.


_W>Поставил тебе хорошую оценку за туториал по _set_se_retranslator и минус( ) за "дурной тон" и /EHac.


_W>Ты представь, что тебе наделает оптимизатор, если он будет ждать исключения от любой ассемблерной команды? Все оптимизации, которые он может провести, зная что данный участок кода не бросает исключения, он не сделает.


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

_W>И почему "дурной тон"? У нас это ловится на самом верху в функции WinMain, там делается минидамп стека и предлагается отправить письмо в поддержку (ну и еще в сугубо системном коде написанном на "С++ без классов", практически на С) Что здесь "дурного" ?


Потому что это не стандартный С++. Кроме того, лучше унифицировать процесс обработки исключений.

_W>Как раз _set_se_retranslator — это дурной тон, поскольку создаёт иллюзию у начинающего программиста, что после обработки исключения программа осталась в определённом состоянии.


Начинающим программистам надо учиться. В том числе и работе с продвинутыми средствами.

_W>Нет, если уж выкинуто SEH, надо забыть про С++ и начать игру по другим правилам.


Это слишком сильное утверждение. Есть конкретные случаи, когда применение SEH оправдано.
Например, для перехвата исключений сопроцессора.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[3]: Как перехватывать фатальные ошибки
От: _Winnie Россия C++.freerun
Дата: 18.11.05 13:39
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Здравствуйте, _Winnie, Вы писали:

_W>>Здравствуйте, Шахтер, Вы писали:

>Проблема надуманая. Никаких помех оптимизации это не создаёт.

http://rsdn.ru/Forum/?mid=1469428&amp;flat=0
Автор: _Winnie
Дата: 02.11.05

Все зависит от приложения. Если мы пишем GUI-враппер для базы данных, то да, никаких проблем, да, конечно.

Ш>Потому что это не стандартный С++.

А _set_se_translator — стандартный?
Ну уж нет, я предпочту в программе явные ms-specific кейворды __try, чем молчаливое неправильное поведение на другой платформе.

>Кроме того, лучше унифицировать процесс обработки исключений.

Ну, он унифицирован дальше некуда. один __try на самом верху.

_W>>Как раз _set_se_retranslator — это дурной тон, поскольку создаёт иллюзию у начинающего программиста, что после обработки исключения программа осталась в определённом состоянии.


Ш>Начинающим программистам надо учиться. В том числе и работе с продвинутыми средствами.

_W>>Нет, если уж выкинуто SEH, надо забыть про С++ и начать игру по другим правилам.

Ш>Это слишком сильное утверждение. Есть конкретные случаи, когда применение SEH оправдано.

Да, но пытаться им ловить и обрабатывать запись по левому указателю не тот случай, согласись.

Ш>Например, для перехвата исключений сопроцессора.

Во-первых, господин MT собирался перехватить
>Можно ли перехватить фатальные ошибки вроде "Memory could not be read"
Во-вторых, "для перехвата исключений сопроцессора" это тоже называется "забыть про С++". Под рукой стандарта нет, но насколько я помню, деление на ноль/переполнение и тп. это implementation defined.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[4]: Как перехватывать фатальные ошибки
От: srggal Украина  
Дата: 18.11.05 14:21
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>В большинстве случаев, можно предположить, что C-функции исключений не выбрасывают. Задав опцию /EHc можно несколько ускорить код. Естественно, если вы предполагаете, что некоторые C-функции в вашем приложении могут выбросить исключение, например потому, что вы передаёте им в качестве параметров указатель, который может быть не валидным, то использовать этот флаг не стоит. Хотя на мой вкус, данный подход при проектировании приложений контрпродуктивен.


Если не ошибаюсь, то

В большинстве случаев, можно предположить, что C-функции исключений не выбрасывают


Значит что:


void foo()
{
    throw std::runtime_error( __FUNCTION__ );
}

void bar()
{
    foo();
}


MSVC считает что bar и есть такая функция. В силу таких предполажений ИНОГДА случаются коварные глюки в release-версии.

ЗЫ
Могу и ошибаться
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: для BC6
От: Lepsik Индия figvam.ca
Дата: 19.11.05 03:25
Оценка:
что-то типа такого :


в хидере
#define TRY       bool fl_try = true; std::string str_err; __try{  try
#define TRY2      fl_try = true; str_err; __try{  try
#define CATCH( f )   catch(Exception &e){ Add2LogE( e, (f, __ThrowLineNumber()) ); } catch(...){ LogError( sts::Stos(__ThrowExceptionName()) + " on line : " + sts::itos(__ThrowLineNumber()), f ); }  } __except( filter( GetExceptionInformation(), str_err) ) { LogError( str_err + " on line : " + sts::itos(__ThrowLineNumber()), f ); } if( !fl_try )



в теле

int filter(EXCEPTION_POINTERS *xp, string &line )
{
  int return_code;
  EXCEPTION_RECORD *xr = xp->ExceptionRecord;
  line = ("ExceptionCode: " + IntToStr(xr->ExceptionCode)).c_str();
  switch (xr->ExceptionCode)
  {
    case EXCEPTION_ACCESS_VIOLATION:
      return_code = EXCEPTION_EXECUTE_HANDLER;
      line += ("\nExceptionAddress: " + IntToHex((int)xr->ExceptionAddress,8)).c_str();
      break;

    default:
      return_code = EXCEPTION_CONTINUE_SEARCH;
      break;
  };
  return return_code;
}




а использовать так :

TRY
{
.... 5/0;

return true;
}CATCH(__FUNC__, __LINE__){ ... }

return false;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.