【发布时间】: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