Visual Studio 2008 - 应用程序在发生未处理的异常时关闭

时间:2008-10-09 16:35:59

标签: c# vb.net visual-studio-2008 debugging

在调试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#中演示此问题

3 个答案:

答案 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框。

你可能会有一些与你所拥有的代码不同而且时髦的东西,但它可能会解决这个问题。