none
怎么捕获到win32异常? RRS feed

  • 问题

  • c#开发的项目中,已处于测试阶段,最近时常出现“未经处理的win32异常”,IntelliTrace中断后,看不到相关信息,对可能相关的代码段加上trycatch,仍然捕捉不到具体的错误信息。

    这类错误是因为某个API导致的吗,还是别的原因?除了API,项目中还引用了一些dll项目。我想定位产生错误的具体代码,怎么做呢?

    此外代码写成下面的样子:

    try
    {
           Application.Run(new myForm());//这里是程序的最顶层
     }
     catch (Exception e)
     {
    }

    是否从理论上说,上面的代码一定能捕捉到程序运行期间发生的所有错误?

    望高手指点一下,谢谢!

    • 已编辑 JSHZP 2011年11月19日 7:36
    2011年11月19日 3:44

答案

  • 不是。从理论上,只能捕获 CLR 异常 (也不是全部的 CLR 异常),Win32 异常无法捕获。除非将 catch (Exception) 改成 catch。

    请注意 catch (Exception) 和 catch { } 的区别。catch { } 捕获 CLR 和非 CLR 异常。但不是全部。

    要知道最后一次 Win32 异常到底是什么,可以调用 Marshal.GetLastWin32Error()。如果知道异常的 HRESULT,也可以调 Marshal.GetExceptionForHR()。


    Mark Zhou
    • 已标记为答案 JSHZP 2011年11月21日 14:14
    2011年11月21日 9:02

全部回复

  • 我估计应该是某个函数调用了本地 API 后异常导致的。

    但是,我在实际看到的时候,往往都可以看到是哪个 托管函数调用导致的,不会仅仅出现一句话而已。

    但是,如果这个异常不影响程序的运行,那么很多时候,CLR会在调试模式出现一个提示而已。

    在托管代码出是不可能捕获到这个异常的,因为已经处理过了。


    我也有自己的签名档哦!
    2011年11月21日 5:10
  • 不是。从理论上,只能捕获 CLR 异常 (也不是全部的 CLR 异常),Win32 异常无法捕获。除非将 catch (Exception) 改成 catch。

    请注意 catch (Exception) 和 catch { } 的区别。catch { } 捕获 CLR 和非 CLR 异常。但不是全部。

    要知道最后一次 Win32 异常到底是什么,可以调用 Marshal.GetLastWin32Error()。如果知道异常的 HRESULT,也可以调 Marshal.GetExceptionForHR()。


    Mark Zhou
    • 已标记为答案 JSHZP 2011年11月21日 14:14
    2011年11月21日 9:02