2014-01-09 3 views
0

У меня есть блок TRY, который в настоящее время перехватывает все исключения:Обработка почти все исключения в C++

try 
{ 
    // do some work 
} 
catch (std::exception &ex) 
{ 
    // log ex 
} 

Однако, я не хочу, чтобы поймать нарушения прав доступа. Могу ли я указать это как исключение (так сказать) моего обработчика? Или я должен сначала поймать его и перебросить?

+2

Обратите внимание, что ваш оператор 'catch' не отображает все исключения. Только те, которые происходят из 'std :: exception'. В C++ исключения не требуются для получения из 'std :: exception' или даже экземпляров класса; вы можете «бросить» 'int', например. –

ответ

9

Вы уже неcatch Нарушения доступа и вы никогда не могли. Нарушения доступа не являются исключениями C++. Они являются «исключениями» другого типа —, которые возникают в вашей операционной системе. На самом деле я предпочитаю не называть их «исключениями».

Операционные системы Linux и Linux просто прекращают процесс (используя сигнал ), который выполняет нарушение доступа.

В Windows вместо этого используется нечто, называемое «структурированные исключения», которое вы потенциально можете уловить и, возможно, проигнорировать использование языковых расширений в Visual Studio. Сейчас мы выходим из-за темы, но вы можете read up about those. Я бы не рекомендовал их использовать, заметьте. Как только у вас возникло нарушение прав доступа, я бы лично сказал, что «все ставки отключены», и «у нас есть некоторая отладка».

+1

Хотя, если вы используете Visual C++, расширения языка делают SEH очень похожими на исключения, из того, что я понимаю. Конечно, исключения SEH по-прежнему не являются исключениями C++. –

+0

Вы можете, однако, заблокировать доступ к доступу на * nix, настроив обработчик сигнала SIGSEGV. Справедливости ради стоит сказать, что программа, которая запускает этот сигнал, вероятно, сломана в любом случае, но это хороший способ «поймать» такие нарушения и получить информацию о регистрации. – greyfade

+0

@greyfade: Технически, да, но [blimey вы действительно не должны] (https://www.securecoding.cert.org/confluence/display/seccode/SIG35-C.+Do+not+return+from+a + вычислительное + исключение + сигнал + обработчик)! И, конечно же, это не поддерживается в рамках языка. –

Смежные вопросы