【问题标题】:Xamarin.UWP UnhandledException Event Handler Never Gets FiredXamarin.UWP UnhandledException 事件处理程序永远不会被触发
【发布时间】:2018-06-12 09:35:37
【问题描述】:

在我的 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 处理程序会被调用,但这不会发生,无论是调试还是发布模式。我在这个处理程序中设置了一个断点,但这个断点永远不会到达。

另一方面,在 Xamarin.Android 上执行相同操作将到达断点。

更新

它似乎只有在应用程序加载并发生未处理的错误后才能工作。因此,在这两种情况下(在 c-tor 或 onLaunched 中连接 UnhandledException)如果在应用程序加载后发生错误(即单击按钮时)都将起作用。否则,即在加载应用程序期间发生未处理的异常,事件处理程序永远不会在 Xamarin.UWP 中命中。 有趣的是,在 Xamarin.Android 上,处理程序将始终被命中。

【问题讨论】:

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


    【解决方案1】:

    我有意在我的代码中引入 DevideByZeroException,它从未被处理过,我希望我的 OnUnhandledException 处理程序会被调用,但这不会发生,无论是 Debug 还是 Release 模式。

    OnUnhandledException 处理程序不会在我将DevideByZeroException 放在应用程序的构造函数中时被调用。如果我将它放在OnLaunched 方法中,它将按预期调用,并放入MainPage 的构造函数中。

    根据document,只有当应用代码不再有可能捕获异常时才会触发此事件。

    请注意,只有当应用代码不再有可能捕获异常时,才会触发此事件。例如,假设应用事件处理程序调用 Windows 运行时 API,而后者又调用回调。如果内部应用程序代码引发异常但未捕获它,则异常将通过 Windows 运行时传播回应用程序代码的外层,从而有机会捕获它。仅当应用代码不再有机会通过正常传播捕获异常时,才会触发 UnhandledException 事件。

    为了直接捕获异常,您可以使用try-catch 技术。更多内容可以参考Exception handling for Windows Runtime apps in C# or Visual Basic

    【讨论】:

    • 感谢 Nico,我正在使用 try..catch,但总有可能出现未处理的异常,因此使用 UnhandledException 事件来处理并帮助发现它们。我知道它只有在所有其他处理它的机会都用尽时才会触发
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多