Я использую метод из сторонней библиотеки dll, и он выдает исключение «Исправление чтения с ошибкой 0x00000000». Я не могу копать, поэтому мне просто интересно, есть ли все равно, чтобы поймать его, чтобы не свернуть приложение. Я пробовал следующие 4 метода, но ни один из них не работает.Поймать исключение «Исправление ошибки доступа 0x00000000»
1,
try
{
sts = resFilter->initialize(m_JPEG2000File); // it throws that exception
}
catch (...){
printf("Gotcha0...");
int a = 34;
}
2, 3 и 4
LONG WINAPI CrashHandler1(EXCEPTION_POINTERS * a/*ExceptionInfo*/)
{ std::cout << "Gotcha1!" << std::endl;
return 0;
}
void CrashHandler2()
{ std::cout << "Gotcha2!" << std::endl;}
void CrashHandler3()
{ std::cout << "Gotcha3!" << std::endl;}
// in Main()
::SetUnhandledExceptionFilter(CrashHandler1);
std::set_terminate (CrashHandler2);
std::set_unexpected(CrashHandler3);
Test(); // It would throw "Access violation reading location 0x00000000" exception
Если я его отладки, исключение будет брошено. Если я запустил его во время выполнения, «Gotcha1!» будет отображаться в консоли, но приложение все равно будет разрушено. Есть ли способ, которым я могу съесть это исключение?
Спасибо заранее,
Бен
Edit:
@Adriano Репетти упоминается __try и __except может поймать это исключение.
Спасибо за все, что вы, ребята, хедз-ап за то, что не едите это исключение!
У меня есть внешний исполняемый файл C#, вызывающий этот проект. Я хочу поймать это исключение, поэтому у меня есть шанс зарегистрировать ошибку и не свернуть приложение C#. Я бы все же прекратил этот очень C++-процесс. Я зацикливаю данные на C#, которые каждый раз запускают новый C++-процесс с нуля, поэтому это будет новый экземпляр C++. Поэтому подход Адриано работает для меня.
попробовать с '' __try' и __except' (нарушение прав доступа не то _known_ на C++), но я хотел бы предложить, чтобы сделать ** не ** делать Это. Вы не знаете, что произошло, вы не знаете, что было выполнено, память (и данные!) Может быть повреждена даже в вашем коде. –
Кстати, это может быть ваш код, который испортил их данные ... –
Если вы используете MSVC++, то вы можете просто изменить параметр компиляции, использовать/EHa и catch (...). Не запускайте этот код еще раз, он съест ваш обед.Телефон навсегда станет лучшим способом справиться с этим, не забудьте получить небольшой репрограммный проект, когда вы вызываете программиста этой библиотеки. –