在WPF应用程序中全局捕获异常?

我们有一个WPF应用程序,其中的某些部分可能会在运行时引发异常。我想全局捕获任何未处理的异常并将其记录下来,但是否则继续执行程序,就好像什么都没有发生一样(有点像VB的On Error Resume Next)。

这在C#中可能吗?如果是这样,我到底需要在哪里放置异常处理代码?

目前,我看不到任何可以包裹try/的点,catch并且可以捕获所有可能发生的异常。即使那样,我仍然会因为捕获而留下任何已执行的内容。还是我在这里以错误的方向思考?

ETA:因为下面的许多人指出:该应用程序不是用于控制核电厂的。如果它崩溃了,那没什么大不了的,但是主要与UI相关的随机异常在使用它的上下文中是很麻烦的。有(可能仍然有)其中的一些,由于它使用了插件架构,并且可能会被其他人扩展(在这种情况下,也是学生;因此,没有经验的开发人员能够编写完全无错误的代码)。

至于捕获的异常:我确实将它们记录到日志文件中,包括完整的堆栈跟踪。这就是整个练习的重点。只是为了反驳那些从字面上把我比作VB的OERN的人。

我知道盲目地忽略某些错误类别是危险的,并且可能会损坏我的应用程序实例。如前所述,该程序对于任何人都不是关键任务。在他们的正确思想中,没有人会下注于人类文明的生存。它只是一个用于测试某些设计方法的小工具。软件工程。

为了立即使用该应用程序,异常不会发生很多事情:

  • 没有异常处理-错误对话框和应用程序退出。尽管可能有其他主题,但必须重复进行实验。尚未记录任何错误,这是不幸的。

  • 通用异常处理–良性错误被捕获,没有造成危害。从我们在开发过程中看到的所有错误来看,这应该是常见的情况。忽略这种错误不会立即产生后果;核心数据结构已经过充分测试,因此很容易幸免。

  • 通用异常处理–严重的错误被困,可能在以后崩溃。这可能很少发生。到目前为止,我们从未见过。无论如何,都会记录该错误,并且崩溃是不可避免的。因此,这在概念上与第一种情况相似。除了我们有堆栈跟踪。在大多数情况下,用户甚至不会注意到。

至于程序生成的实验数据:严重的错误在最坏的情况下只会导致不记录任何数据。微妙的改变几乎不可能改变实验结果。即使在这种情况下,如果结果看起来可疑,也会记录错误;如果这是一个整体异常值,仍然可以丢弃该数据点。

总结一下:是的,我认为自己至少仍然是部分理智的人,并且我不认为会导致程序运行必定完全有害的全局异常处理例程。如前所述,取决于应用程序,这样的决定可能是有效的。在这种情况下,它被认为是一个有效的决定,而不是胡说八道。对于任何其他应用程序,该决定可能看起来有所不同。但是请不要指责我或从事该项目的其他人可能因为我们无视错误而震惊了整个世界。

旁注:该应用程序只有一个用户。并不是像Windows或Office那样被成千上万的人所使用,首先让异常泡在用户头上的成本已经完全不同了。


慕莱坞森
浏览 1068回答 3
3回答

jeck猫

除了此处提到的其他内容外,请注意,将&nbsp; Application.DispatcherUnhandledException(及其类似内容)与<configuration>&nbsp; <runtime>&nbsp;&nbsp;&nbsp; &nbsp; <legacyUnhandledExceptionPolicy enabled="1" />&nbsp; </runtime></configuration>中的,app.config将防止您的辅助线程异常关闭应用程序。

杨魅力

AppDomain.UnhandledException事件此事件提供未捕获的异常的通知。它允许应用程序在系统默认处理程序向用户报告异常并终止应用程序之前记录有关异常的信息。&nbsp; &nbsp;public App()&nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; AppDomain currentDomain = AppDomain.CurrentDomain;&nbsp; &nbsp; &nbsp; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}&nbsp; &nbsp;static void MyHandler(object sender, UnhandledExceptionEventArgs args)&nbsp;&nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; Exception e = (Exception) args.ExceptionObject;&nbsp; &nbsp; &nbsp; Console.WriteLine("MyHandler caught : " + e.Message);&nbsp; &nbsp; &nbsp; Console.WriteLine("Runtime terminating: {0}", args.IsTerminating);&nbsp; &nbsp;}如果UnhandledException事件是在默认应用程序域中处理的,则无论该线程在哪个应用程序域中启动,任何线程中任何未处理的异常都会在该事件中引发。如果该线程在具有UnhandledException事件处理程序的应用程序域中启动,该事件在该应用程序域中引发。如果该应用程序域不是默认应用程序域,并且默认应用程序域中还有一个事件处理程序,则在两个应用程序域中都会引发该事件。例如,假设线程在应用程序域“ AD1”中启动,在应用程序域“ AD2”中调用一个方法,然后从那里调用应用程序域“ AD3”中的方法,在该线程中引发异常。可以引发UnhandledException事件的第一个应用程序域是“ AD1”。如果该应用程序域不是默认应用程序域,那么也可以在默认应用程序域中引发该事件。
打开App,查看更多内容
随时随地看视频慕课网APP