捕获“访问冲突读取位置0x00000000”异常

时间:2015-06-12 14:57:03

标签: c++ exception try-catch

我正在使用来自第三方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 ++实例。所以阿德里亚诺的方法适合我。

2 个答案:

答案 0 :(得分:2)

不要&#34;吃&#34;访问违规;那种疯狂的谎言。

在我看来,您正试图取消引用空指针。也许根本就是不这样做!

if (!resFilter) {
   // do something else; e.g. did you fail to initialise the library properly?
   throw "Yikes!";
}

// OK; pointer is not NULL at least: let's go!
sts = resFilter->initialize(m_JPEG2000File);

现在,如果您从 获得访问冲突,那么该库非常错误,您应该立即停止使用它,除非有可用的修补程序或补丁。

由于您使用的是Windows,如果您只想检测问题以进行日志记录,则可以使用Visual Studio's non-standard __try/__catch construct,但请务必在记录问题后立即终止该过程,因为进程(特别是库的状态)将是不稳定的,在此之后你没有用它做任何意义!

__try  { 
    sts = resFilter->initialize(m_JPEG2000File);
} 
__except(
   GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION
   ? EXCEPTION_EXECUTE_HANDLER
   : EXCEPTION_CONTINUE_SEARCH) { 
    std::cerr << "OMG!\n";
    exit(-1);
}

答案 1 :(得分:0)

__ try和__except可以捕获此异常。感谢@Adriano Repetti!

这是一篇关于它的好文章: C++, __try and try/catch/finally