Отказ от ответственности
Подобные вещи бесполезны, кроме отладки.Существует не так много законных причин для продолжения вашей программы после исключения доступа к памяти, потому что обычно это указывает на повреждение данных.
При этом я думаю, что лучше ответить на вопрос, чем выносить суждение, осуждать или подвергать цензуреit.
Классы C ++, полученные из exception
, просто удобны для поощрения хорошей практики среди программистов.Они не имеют специальной семантики и не различаются ни в чем, кроме имени.
Хуже того, исключения C ++ не могут проходить вне обработчика сигнала (то, что в других языках будет называться «обработчиком исключения»), функция, котораяпризвал к незаконному доступу).Стандарт имеет специальное предупреждение об этом:
[простая старая функция], которая может использоваться в качестве обработчика сигнала в соответствующей программе на C, не дает неопределенного поведения при использовании в качестве обработчика сигнала вC ++ программа.Поведение любой другой функции, используемой в качестве обработчика сигнала в программе на C ++, определяется реализацией.213)
213) В частности, обработчик сигнала, использующий обработку исключений, с большой вероятностью может иметь проблемы
Тем не менее, если вы хотите поймать это, используйте средство UNIX signal
для установки функции, которая не использует функции C ++.
#include <csignal>
#include <cstdlib>
#include <cstdio>
void catch_memory( int ) {
std::printf( "caught!\n" );
std::abort();
}
int main() {
std::signal( SIGSEGV, catch_memory );
int *i = 0;
*i = 6;
}