Обрабатывать исключение нарушения прав доступа в C ++ Builder? - PullRequest
1 голос
/ 05 июня 2009

Я пытаюсь сделать:

try{
    int * i = NULL;
    *i = 3;
}catch(Exception &Err){
    ShowMessage(Err.Message);
}

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

Но по какой-то причине я получаю простой

Нарушение прав доступа

сообщение вместо полного

Нарушение доступа XXX в модуле YYY. Запись по адресу ZZZ.

Кстати, ExceptObject() процедура возвращает NULL по какой-то странной причине.

Что мне здесь не хватает?

Ответы [ 4 ]

1 голос
/ 14 сентября 2010

В BCB5 работает перехват EAccessViolation, например ::100100

 #define AV_TRY { try {

 #define AV_CATCH } catch(EAccessViolation &av) {Application->MessageBox((("Access Violation caught: " + string(__FILE__) + "; " + string(__FUNC__) + "; " + IntToString(__LINE__) + "\n\n") + av.Message.c_str()).c_str(), ("Program Error in " + string(class_name.c_str())).c_str(), MB_OK);} }

Обратите внимание, что имя_класса является специфическим для этого проекта и, вероятно, должно быть заменено на AnsiString (this-> ClassName) или пропущено. Также я переключил этот код с тихого входа в базу данных, чтобы показать MessageBox. Я просто обертываю код, где я наблюдал AVs в AV_TRY ... AV_CATCH.

1 голос
/ 05 июня 2009

См. Запись блога MSDN по Смешивание исключений SEH и C ++ . Это два разных типа исключений. Попытка поймать структурированное исключение, сгенерированное ОС, как исключение C ++ не является правильным выходом из коробки. Умерить этот бит с этой публикацией о том, что она не делает .

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

0 голосов
/ 06 июня 2009

Стандарт C ++ не определяет, что разыменование NULL-указателя вызывает исключение - он говорит, что приводит к неопределенному поведению. На платформах Windows вода в некоторой степени загрязнена структурной обработкой исключений Windows. Это не имеет ничего общего с обработкой исключений C ++, за исключением того, что некоторые среды выполнения C ++ могут преобразовывать эти исключения в исключения C ++. Однако код, который зависит от таких переводов, не является переносимым.

0 голосов
/ 06 июня 2009
try {
    int * i = NULL;
    *i = 3;
}
catch (...) {
    // This would catch the access violation but you don't have any more
    // information of what has gone wrong
}

Однако вы можете использовать структурированную обработку исключений (SEH) для перехвата всех исключений C ++. Поскольку исключения C ++ являются просто реализацией на основе классов, основанной на SEH.

...