在我的App.xaml.cs ctor中,我联系了UnhandledException
this.UnhandledException += OnUnhandledException;
,然后我提供了处理程序来向GoogleAnalytics发送错误信息
private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
var unhandledException = e.Exception;
AnalyticsManager.LogError("", e.Exception.Message, "UnhandledException");
}
我故意在我的代码中引入DevideByZeroException
从未处理过,我希望调用OnUnhandledException
处理程序,但不管Debug或Release模式如何都不会发生这种情况。我在这个处理程序中设置了一个断点,并且永远不会达到该断点。
另一方面,在Xamarin.Android上执行相同操作将达到断点。
更新
只有在加载应用程序并且发生未处理的错误时,它似乎才有效。因此,在两种情况下(在c-tor或onLaunched中挂起UnhandledException)如果在加载app之后发生错误,即在按钮点击时,将会起作用。否则,即在加载app期间发生未处理的异常,事件处理程序永远不会在Xamarin.UWP中被命中。 有趣的是,在Xamarin.Android上,处理程序将始终被击中。
答案 0 :(得分:1)
当我将我故意在我的代码中引入了DevideByZeroException,这个异常从未被处理过,我希望我的OnUnhandledException处理程序能够被调用但不会发生,无论是Debug还是Release模式。
OnUnhandledException
放在App的构造函数中时,不会调用 DevideByZeroException
处理程序。如果我将它放在OnLaunched
方法中,它将按预期调用,以及放入MainPage的构造函数。
根据document,只有在应用代码不再有可能捕获异常的情况下,才会触发此事件。
请注意,只有当应用代码无法捕获异常时,才会触发此事件。例如,假设应用程序事件处理程序调用Windows运行时API,而后者又调用回调。如果内部应用程序代码抛出异常并且没有捕获它,则异常将通过Windows运行时传播回应用程序代码的外层,从而有机会捕获它。只有当应用程序代码没有机会通过正常传播捕获异常时才会触发UnhandledException事件。
为了直接捕获异常,您可以使用try-catch
技术。有关更多信息,请参阅Exception handling for Windows Runtime apps in C# or Visual Basic。