【发布时间】:2015-08-28 15:31:35
【问题描述】:
我正在使用来自 3rd 方 dll 的方法,它会引发“访问冲突读取位置 0x00000000”异常。我无法深入研究,所以我只是想知道是否有办法抓住它,所以不要折叠应用程序。我尝试了以下 4 种方法,但均无效。
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!”将显示在控制台中,但应用程序仍会崩溃。有什么办法可以吃这个例外吗?
提前致谢,
本
编辑:
@Adriano Repetti 提到 __try 和 __except 可以捕获此异常。
感谢你们不吃那个例外!
我有一个调用该项目的外部 C# 可执行文件。我想捕获这个异常,这样我就有机会记录错误并且不折叠 C# 应用程序。我仍然会终止这个非常 C++ 进程。我在 C# 中循环数据,每次都会从头开始一个新的 C++ 进程,所以它会是一个新的 C++ 实例。所以阿德里亚诺的方法对我有用。
【问题讨论】:
-
尝试使用
__try和__except(访问冲突不是 C++ 的已知),但我建议不做。你不知道发生了什么,你不知道已经执行了什么,内存(和数据!)甚至在你的代码中也可能被破坏。 -
顺便说一句,甚至可能是您的代码破坏了他们的数据...
-
如果你使用 MSVC++ 那么你可以简单地改变一个编译选项,使用 /EHa 并且 catch (...) 会吃掉。不要再次运行该代码,它会吃掉你的午餐。电话永远是解决这个问题的最佳方式,当你打电话给这个库的程序员时,一定要准备一个小的 repro 项目。
-
感谢阿德里亚诺和汉斯,我会马上尝试。如果我加载另一个文件一切正常,所以我确定异常是从他们的程序集内部抛出的。我正在打开一个文件夹中的所有文件,如果有问题我只想跳过它并进入下一个。所以我觉得“吃”这个例外对我来说是相对安全的。
-
@Adriano Repetti,谢谢 __try 作品。