c++ - 捕获 "Access violation reading location 0x00000000"异常

标签 c++ exception try-catch

我正在使用来自第 3 方 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 可以捕获这个异常。

感谢你们所有不吃那个异常(exception)的人!

我有一个调用此项目的外部 C# 可执行文件。我想捕获这个异常,这样我就有机会记录错误并且不会崩溃 C# 应用程序。我仍然会终止这个非常 C++ 的进程。我在 C# 中循环数据,每次都会从头开始一个新的 C++ 进程,因此它将是一个新的 C++ 实例。所以阿德里亚诺的方法对我有用。

最佳答案

不要“吃掉”访问违规;那种疯狂的谎言。

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

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);
}

关于c++ - 捕获 "Access violation reading location 0x00000000"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30806174/

相关文章:

java - 是否可以在 catch 中重新分配最终变量,即使分配是 try 中的最后一个操作?

c++ - 复杂的类成员构造

android-studio - Android studio : I am getting the following error "java.util.NoSuchElementException". 但是,我无法追踪错误

c++ - 从具有行优先顺序的数组创建特征矩阵

c# - 如何查找运行 WPF 应用程序时抛出的异常?

java - 如何通过 Exception getCause() 循环查找带有详细消息的根本原因

c# - 使用 C# 从 C# 中退出类

java - Try/Catch 内部或外部函数

C++:struct 和 new 关键字

c++ - 如何在深拷贝中使用构造函数分配内存?