2011-07-25 16 views
1

我目前正在使用现有的Windows Forms应用程序(VB.net),并且正在忙于重新处理异常处理机制。找出用户代码中发生了内部.Net异常的位置

目前,代码中的很多方法都被try/catch块包围,捕获一个通用的异常,然后调用一个实用工具方法,向用户显示一个消息框,通知他错误,然后记录下来。

因此,在很多情况下,不会采取纠正措施,只会记录异常。我知道这可能不是最好的方式,但这是他们在不久的将来必须要做的方式。

无论如何,我想这样做在一个更通用的方式,所以我迷上了Application.ThreadException和AppDomain.UnhandledException。

这似乎工作得很好,除了一个不便之处。无论何时从.net运行时本身或第三方控件抛出一个错误,堆栈跟踪都会从框架方法或第三方方法(显然是!)中抛出异常的地方开始。

但是,如果我有完全相同找出其中这些异常越过边界进入我的代码的一种简单的方法将是更加便利。我想要一个简单的方法来确定(在Application.ThreadException中)在我自己的代码中发生异常的地方。

我知道这个信息包含在Exception.StackTrace属性,但我想一个简单的方法来获得这个特定的信息看到,因为堆栈跟踪属性是一个巨大的字符串。

基本上我想类,方法和行号异常第一冒泡到我的代码。

回答

0

你应该尝试使用这种代码:

[STAThread] static void Main() { 
    try { 
    Application.Run(new Form1()); 
    } 
    catch (Exception e) { 
    //do smth with exception 
    } 
} 

它会赶上的,只有你的代码,当在同一时间AppDomain.UnhandledException可以更详细引发的异常。当然,这只适用于主线程。

+0

因此,如果我的代码调用第三方控件并且该控件引发异常,它是否会被您建议的代码捕获?那么Stacktrace的原点是什么? – Quagmire

+0

我相信原点将在第三方控件中,但它也会包含您的代码。 – Restuta

+0

我刚刚在一个小测试项目中尝试了这个,它似乎没有工作。在调试(Visual Studio)中运行时,我可以像您所建议的那样捕获异常,但在此之后,我的应用程序会自动关闭。如果我在发布模式下尝试这种方式,我只是得到一个标准的.Net消息框,用于未处理的异常,就像我将得到的,如果我根本没有发现错误 – Quagmire

相关问题