C# 如何链接对Application.ThreadException的调用?
在WinForms应用程序(.NET 4.5.1)中,如果向C# 如何链接对Application.ThreadException的调用?,c#,.net,winforms,.net-4.5,C#,.net,Winforms,.net 4.5,在WinForms应用程序(.NET 4.5.1)中,如果向应用程序添加多个处理程序,则仅调用最近添加的处理程序。我在文档中没有看到任何解释。事实上,它表明,“附加事件处理程序…”注意“处理程序”的复数形式 下面是一个示例,说明了该行为: internal class Form1 : Form { [STAThread] static void Main() { Application.ThreadException += (sen
应用程序添加多个处理程序,则仅调用最近添加的处理程序。我在文档中没有看到任何解释。事实上,它表明,“附加事件处理程序…”注意“处理程序”的复数形式
下面是一个示例,说明了该行为:
internal class Form1 : Form
{
[STAThread]
static void Main()
{
Application.ThreadException +=
(sender, args) => Console.WriteLine(@"This is never printed");
Application.ThreadException +=
(sender, args) => Console.WriteLine(@"Only this is printed");
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
public Form1()
{
var button = new Button {Text = @"CRASH!"};
button.Click += (sender, args) => throw new NotImplementedException();
Controls.Add(button);
}
}
是否有某种方法可以检索现有的处理程序并从我自己的处理程序调用它?我询问的原因是,我正在尝试将新的MS AppCenter SDK集成到我的应用程序中,它向application.ThreadException
添加了一个处理程序。我想添加自己的处理程序,但在发生异常时仍调用AppCenter处理程序
下面是一段伪代码,说明了我要做的事情:
static void Main()
{
AppCenter.Start("id", typeof(Crashes));
var handler = GetCurrentThreadExceptionHandler();
Application.ThreadException += (sender, args) => {
handler?.Invoke(sender, args);
Log("Something happened");
new UnhandledErrorDialog().Show();
};
}
除了日志记录之外,您不应该使用应用程序处理程序进行任何操作。如果它是一个具有单个值的全局变量还不够糟糕,那么对于异常处理来说,它也可能是一个糟糕的设计。我有两篇关于异常处理的文章,我经常链接这些文章,这应该会给你一些关于基本知识的想法:|在多任务处理中处理异常的预期方法是捕获它们并将它们与结果一起分发。任务类有一个值来存储异常。BackgroundWorker负责捕获并公开异常(如果存在异常,并且您尝试访问结果,那么您将获得异常重新恢复)。@Jimi,您认为这是一个bug吗current.threadExceptionHandler=value
vs预期值current.threadExceptionHandler+=value
?@nosratio只有在应用程序运行之前才能订阅此项。它应该处理UI线程异常。对于其他线程,存在未处理的异常。