有人可以解释一下如何正确处理应用程序范围的异常 - c#

我似乎无法正确应对意外异常。

考虑以下应用程序:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new SomeForm());
}

class SomeForm : Form
{
    public SomeForm()
    {
        Button btn = new Button();
        btn.Text = "Click ME";
        btn.Location = new System.Drawing.Point(20, 20);
        btn.Click += new EventHandler(btn_Click);
        Controls.Add(btn);
    }

    void btn_Click(object sender, EventArgs e)
    {
        throw new Exception("This is an Exception");
    }
}

如果我运行此应用程序并单击按钮,则会收到未预期的异常。起初我尝试围绕Application.Run运行一个try catch块,如下所示:

    try { Application.Run(new SomeForm()); }
    catch { MessageBox.Show("Exception caught in try catch"); }

最初,这似乎可行,直到我在Debugger之外运行了该应用程序。当您在调试器之外运行应用程序时,该异常将报告为未处理的错误。经过一番阅读后,我发现我应该查看Application.ThreadException事件。因此,我执行以下操作:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
    try { Application.Run(new SomeForm()); }
    catch { MessageBox.Show("Exception caught in try catch"); }
}

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
    MessageBox.Show("Exception caught in event");
}

现在,当我在调试器之外运行我的应用程序时,将处理异常,并且MessageBox指示该异常已在事件处理程序中捕获。然后,我回到调试器并运行它。现在,调试器将它作为未处理的异常启动,即使我将其包围在try catch中,而且也与Application.ThreadException事件绑定在一起。如果我不绑定Application.ThreadException事件,则try catch块将正确捕获异常。

现在开始提问:

这里到底发生了什么?
有没有一种方法可以捕获/处理应用程序中所有在调试器中和调试器外部均可使用的异常?
我只是在做完全错误的事情吗?

参考方案

您可以使用AppDomain.CurrentDomain.UnhandledExceptionApplication.ThreadException,look for more处理它们。

What's the difference between Application.ThreadException and AppDomain.CurrentDomain.UnhandledException?

.NET C#Webbrowser填充输入,不带ID或类名 - javascript

我需要在网络浏览器中填写一个输入,但这不起作用。我认为必须使用name属性来完成,但是怎么做呢?foreach (HtmlElement login in webBrowser1.Document.GetElementsByTagName("input")) { if (login.GetAttribute("name"…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……

asp.net mvc中的对象数组数据始终为null - javascript

我需要通过json将对象数组发送到asp.net mvc 2,但是我在mvc控制器中没有得到null对象是这样的entries[1].date = "12/22/2014" entries[1].Ref = "0002" entries[1].Credit = "100" entries[2].da…

ASP.NET MVC中应为DataTable返回哪种数据? - javascript

我想为DataTable中的每个页面创建动态加载信息。我正在尝试遵循以下示例:https://www.datatables.net/manual/server-sidehttps://www.datatables.net/manual/data来自示例的代码:$('#example').DataTable( { serverSide: t…

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…