【问题标题】:C++ / WIndows - Can't catch exceptionsC ++ / WINdows - 无法捕获异常
【发布时间】:2013-09-13 13:00:44
【问题描述】:

我是 windows api 的初学者,所以这里一定有一些我不明白的地方。在我的 main 函数中,我使用 try-catch 来捕获所有未捕获的异常,但由于某种原因,我从代码中其他地方抛出的异常永远不会被捕获。我的应用程序使用单个(主)线程。

我是这样扔的:

throw "ClassName::methodName() - Error message";

并在消息循环之外捕获异常:

try {
    while(GetMessage(args...)) {
        TranslateMessage(args...);
        DispatchMessage(args...);
    }
}
catch( const char * sExc ) {
    ::MessageBox(args...);
}

我首先认为这是类型不匹配的问题,但后来我添加了一个带有省略号的 catch(...) ,但我仍然没有发现任何问题。如果你问,是的,我确定抛出异常。这不是与某种异步或类似的问题有关吗?

感谢您的帮助!

【问题讨论】:

  • 字符串文字在哪里被抛出?它在另一个线程上吗?
  • 我尝试删除 const,但结果相同。如果是这样的话,我会感到惊讶,但我在其他代码中一直在这样做,而没有关于 const 的问题,并且抛出的字符串是一个常量。 @Joachim Pileborg:不,我没有在其他地方抓到它。调试器失败并显示以下错误消息:“xxxxxxx.exe 中 0x7c812fd3 处的未处理异常:Microsoft C++ 异常:内存位置 0x0012d124 处的字符 ..”
  • @doctorlove 正如我所说,这不是一个多线程应用程序,所以它来自同一个线程。我假设 DipatchEvent() 正在调用我的窗口过程,这就是异常的来源。
  • 你提到了调试器。 Visual Studio 调试器中的默认设置是在抛出异常时中断,在它实际开始飞行之前(即在堆栈展开和传播开始之前)。当程序中断时尝试点击F5 - 调试器可能会询问“将异常传递给正在调试的程序?”
  • @Virus721,在写有“throw”的行上放一个断点。当断点被命中时,使用 F11 跨过该行。控制权应该转移到任何吃掉异常的地方。

标签: c++ windows exception try-catch


【解决方案1】:

这取决于发送的具体消息。但是不,并非所有这些都允许通过 Windows 内部代码展开堆栈。特别是涉及窗口管理器的消息,例如 WM_CREATE。 Windows 内部有一个支持程序,可以防止堆栈通过关键代码展开。在 64 位版本的 Windows 7 上运行的 32 位代码中的异常也存在问题,当消息需要多次穿越 Wow64 边界时,它们可能会被吞没。在 Windows 8 中已修复。

在更高版本的 Windows 上,这也可以激活“自我修复”代码,自动激活一个 appcompat 垫片来吞下异常。你会收到一个通知,很容易被解雇。然后,您将在 VS 输出窗口中看到第一次机会异常通知,但您的程序会继续运行。对用户来说可能是好的,但在你调试时不是很好。运行 Regedit.exe 并导航到 HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted 并检查您的程序是否在此处列出。删除条目即可。

长话短说,在消息循环之外捕获异常是不安全的。您必须在窗口过程中执行此操作。

【讨论】:

  • 感谢您的回答。我已经将 try-catch 移至窗口过程,但我得到了相同的结果。 throw 和 catch 类型匹配,并且抛出异常,所以我不明白什么不起作用。
  • 我没什么可看的。我已经提到了注册表项。 Debug + Exceptions,确保 Throw 复选框被关闭。
【解决方案2】:

您正在谈论“Windows 结构化异常处理”(http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657%28v=vs.85%29.aspx)。不会抛出 C++ 异常。

如果你想走麻烦的路线:_set_se_translator

另请参阅:Can a C program handle C++ exceptions?(Windows API 不是 C++)

【讨论】:

  • 但是我怎么能在其他windows程序中抛出正常的异常呢?
猜你喜欢
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
相关资源
最近更新 更多