Xamarin.UWP UnhandledException事件处理程序永远不会被解雇

时间:2018-01-02 17:07:22

标签: xamarin.forms xamarin.android unhandled-exception xamarin.uwp

在我的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上,处理程序将始终被击中。

1 个答案:

答案 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