如何尝试/捕获所有exception

我正在完成由其他人启动的UWP应用程序。 该应用程序经常崩溃,我总是在App.gics中结束

if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break(); 

然后,我必须说“不,不要启动调试器”并关闭2个窗口。

有什么地方我可以放一个大的尝试/捕获,以便我不必每次发生时重新启动应用程序? 我在AppShellApp找不到任何东西。

或者我是否必须在每个事件处理程序中放置一个try / catch?

如果您希望每次遇到未处理的exception时都避免启动新调试器并重新启动应用程序,则可以使用Application.UnhandledException事件并将事件参数的Handled属性设置为true,如下所示:

 public App() { this.InitializeComponent(); this.Suspending += OnSuspending; this.UnhandledException += (sender, e) => { e.Handled = true; System.Diagnostics.Debug.WriteLine(e.Exception); }; } 

UnhandledException事件用于通知应用程序XAML框架或Windows运行时遇到的exception,这些exception尚未由应用程序代码处理。

通常在触发UnhandledException事件之后,Windows运行时终止应用程序,因为未处理exception。 应用程序代码对此有一些控制:如果UnhandledException事件处理程序将事件参数的Handled属性设置为true ,那么在大多数情况下,应用程序将不会终止。

有关详细信息,请参阅Application.UnhandledException事件的 备注和博客: Windows Store应用程序中处理错误的策略 。

据我所知,你不能做你想要做的事情(大尝试捕捉阻止),并且出于所有意图和目的,你甚至不应该考虑这种可能性。

首先尝试确定应用程序崩溃的原因,在哪个页面上,当您尝试某些特定内容时,每次都是相同的事情,然后您可以尝试捕获该特定页面上的某些方法并确定导致崩溃的原因

如果要处理原因而不是症状,则应在调试器设置中启用第一次机会exception。 然后调试器应该在exception源处中断,而不是在全局处理程序中。 然后,您可以直接解决问题的根本原因。

运送具有全局处理程序的应用程序盲目地将每个exception设置为“已处理”,即使您不知道它为什么失败也不是一个好的解决方案。

您可以在主应用程序中尝试/捕获以捕获所有exception。 显示的是使用Xamarin Forms DisplayAlert的示例:

  try { //throw new Exception("gone and done it"); MyMainProgram(); } catch (Exception ex) { await DisplayAlert("Whoops!", ex.Message, "ok"); throw ex; } 

你可以通过取消注释“throw new Exception”来测试它。 执行将停止,您必须回答一个警告,然后继续抛出exception以防止执行损坏的代码。