我有一个来自应用程序的窗口,其中包含program.cs代码:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += (sndr, evnt) =>
{
MessageBox.Show("An error occur. Please contact your administrator.\nError description: " +
evnt.Exception.Message + "\nStack trace:\n" + evnt.Exception.StackTrace,
evnt.Exception.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
};
Application.Run(new frmLogin());
}
}
但是当BackgroundWorker.DoWork
事件中抛出异常时,Application.ThreadException
没有抓住它。
Application.ThreadException
如何从 BackgroundWorker
创建的其他主题中捕获异常?
我知道在Application.ThreadException
中捕获错误不是一个好习惯,但我们只将它用作我们最后一级错误捕获。
我的代码在C#,框架4中,在VS2010 Pro中构建。
请帮忙。提前谢谢。
答案 0 :(得分:4)
请参阅this question:BackgroundWorker异常不会像那样传播,因此您无法在ThreadException
中捕获它们。
抛出异常的BackgroundWorkers像往常一样调用RunWorkerCompleted
,但在事件参数上设置Error
属性。
答案 1 :(得分:1)
BackgroundWorker为您捕获异常(不会向Application.ThreadException或AppDomain.UnhandledException公开)并将异常传递给RunWorkerCompleted事件的参数。您将在RunWorkerCompleted事件处理程序上处理异常。
RunWorkerCompletedEventArgs.Error可以在RunWorkerCompleted事件触发后获得异常。
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
// handle exception here
}
}