在调试WinForm VB.NET项目时发生unhandeld异常时出现问题。
问题是我的应用程序终止了,我必须再次启动应用程序,而不是像VS2003中的情况那样重试操作
unhandeld异常在ApplicationEvents.vb中找到的新My.MyApplication类中实现
Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException
Dim handler As New GlobalErrorHandler()
handler.HandleError(e.Exception)
e.ExitApplication = False
End Sub
注意:handler.HandleError只显示一个对话框,并将错误记录到日志文件中。
我还尝试了以下在VS2003中运行的代码,但在VS2008中运行时会产生相同的行为:
AddHandler System.Windows.Forms.Application.ThreadException, AddressOf OnApplicationErrorHandler
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf OnUnhandledExceptionHandler
OnApplicationErrorHandler和OnUnhandledExceptionHandler与handle.HandleError相同
在VS2008之外运行应用程序会导致预期的行为(应用程序不会终止),但它会在调试期间增加我们的测试周期。
更新:我在答案中添加了示例代码以在C#中演示此问题
答案 0 :(得分:1)
好的我已经做了更多的工作,但仍然没有答案。 我发现这个问题不仅与VB.NET有关,而且与C#
有关以下是演示此问题的简单C#程序:
using System;
using System.Windows.Forms;
namespace TestCSharpUnhandledException
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
}
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
MessageBox.Show("Oops an unhandled exception, terminating:" + e.IsTerminating);
}
void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
MessageBox.Show("Oops an unhandled thread exception");
}
private void button1_Click(object sender, EventArgs e)
{
throw new Exception("Dummy unhandled exception");
}
}
}
我发现有趣的是在 VS中调试UnhandledException 事件,但在VS外部运行应用程序会导致 ThreadException 触发。
同样在VS内部,e.IsTerminating设置为true,最终我希望这是假的。 (这是一个只读属性)
答案 1 :(得分:1)
好的,我在这篇博文中找到了这个问题的答案:Handling "Unhandled Exceptions" in .NET 2.0
谢谢Mark!
简短的回答是:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
这会在调试和运行模式下导致相同的行为。导致VS在调试时未关闭
答案 2 :(得分:0)
我不确定VS2008,但我在VS2005中遇到了同样的问题。事实证明,我只需要进入Debug-> Exceptions(或Crtl + Alt + E)并确保未选中所有Thrown框,但会检查所有User-unhandled框。
你可能会有一些与你所拥有的代码不同而且时髦的东西,但它可能会解决这个问题。