我似乎无法正确应对意外异常。
考虑以下应用程序:
[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.UnhandledException
和Application.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…