【发布时间】:2020-01-11 00:31:43
【问题描述】:
我知道在应用程序中捕获所有异常通常很糟糕,但在我的 WPF 应用程序中我会这样做:
Application.Current.DispatcherUnhandledException += (s, e) => {
ReportException(e.Exception, false);
e.Handled = true;
};
这对于防止次要功能(如拖放)和异步代码使应用程序崩溃非常有用 - 我记录并显示信息给用户。
我想在 Xamarin.Mac 中做同样的事情,但似乎没有等价物。我试过了:
AppDomain.CurrentDomain.UnhandledException += (sender, args) => Log(args.Exception);
TaskScheduler.UnobservedTaskException += (sender, args) =>
{
args.SetObserved();
Log(args.Exception);
};
Runtime.MarshalManagedException += (sender, args) => Log(args.Exception);
Runtime.MarshalObjectiveCException += (sender, args) => Log(args.Exception);
但是当在 async void 方法中崩溃时,TaskScheduler.UnobservedTaskException、MarshalManagedException 和 MarshalObjectiveCException 不会被调用,
而AppDomain.Current.UnhandledException 的e.IsTerminating 是get-only,所以我无法阻止应用退出。
对于 Android,有 AndroidEnvironment.UnhandledExceptionRaiser += AndroidEnvironmentOnUnhandledException;
但是对于 Mac,似乎没有办法取消应用程序的宕机?
【问题讨论】:
-
我听说您可以将
UIApplication.Main(args, null, "AppDelegate");包装在 try/catch 块中的Main.cs中,并且如果应用程序将退出 w/code 0 或 w/e 从崩溃而不是在此处退出进入您的 catch 块,它仍然可能会结束应用程序,但可能对调试有用。 -
AppDomain.Current.UnhandledException非常适合用于记录目的,但它和包装 Main 都不能防止应用程序关闭 -
有一个old thread,我想它也许可以回答你的问题。
-
你知道这次关机发生在哪一行吗?它会引发异常捕获点吗?应用程序输出中捕获了什么异常?
-
@Saamer 异常发生在哪里并不重要——我想捕获所有异常并防止应用程序终止。我在
AppDomain.Current.UnhandledException处理程序中得到了异常,我在调试时看到它发生在 Xamarin 主循环中,它记录在应用程序输出中 没有办法阻止应用程序退出,就像在 WPF 上所做的那样跨度>
标签: xamarin xamarin.forms dispatcher unhandled-exception xamarin.mac