我正在尝试记录在我的Xamarin.Forms应用程序中发生的每一个异常。目前我只担心Android设备,到目前为止,我已经看到了两种解决这个问题的方法。
AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException;AndroidEnvironment.UnhandledExceptionRaiser += AndroidEnvironmentOnUnhandledException;这两件事对我都没有用。这是你在寻找解决方案时遇到的唯一两种解决方案,因为这两种方法对我都不起作用,我想我搞错了,但我很困惑。到目前为止,我尝试抛出一个NotImplementedException、一个DivideByZeroException和另一个更复杂的异常,涉及数据绑定,没有一个被捕获。
任何帮助都是非常感谢的,谢谢。
发布于 2021-10-20 10:46:20
有3个钩子你可以用来监控你的应用程序中的崩溃。这不是一个完美的解决方案,可以捕捉应用程序中抛出的每一个异常,但它足以捕获错误&大多数大型崩溃(您几乎永远无法捕获像SIGABRT这样的本地崩溃)。
AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
这将捕获严重的异常,使应用程序域崩溃。可以使用AppCenter跟踪
void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
var exception = e.ExceptionObject as Exception;
// Log somewhere
Console.WriteLine($"App - OnUnhandledException - An exception occurred: {exception}");
// Using App Center
Crashes.TrackError((Exception)e.ExceptionObject);
}TaskScheduler.UnobservedTaskException += OnUnobservedTaskException;
这将捕获任务中未处理的异常。如果您有一个异步函数,该函数由于异常而中断,这将捕获它。通常,这些异常在应用程序中是不可见的。
void OnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
foreach (var exception in e.Exception.InnerExceptions)
{
// Log somewhere
Console.WriteLine($"App - OnUnobservedTaskException - An exception occured: {exception.ToString()}");
// Using App Center
Crashes.TrackError(exception);
}
}Log.Listeners.Add(new DelegateLogListener(OnLogListener));
您可以在表单中侦听内部记录器,以获取诸如绑定、错误等事件。这些日志在开发时非常有用,因为它们可以快速地告诉您为什么某个视图与视图模型之间不工作。
void OnLogListener(string arg1, string arg2)
{
Debug.WriteLine($"App - OnLogListener - {arg1}: {arg2}");
}应用中心
您肯定应该考虑将应用中心 Crashes添加到应用程序中。当应用程序下一次加载时,任何未处理的崩溃都将上传到App。这是为应用程序收集诊断信息的一个很好的方法。
一个警告词,一些涉及链接/缺少引用导致的本机问题的崩溃是令人难以置信的令人讨厌的调试,在代码中根本无法处理。我给出的一个例子是,当一个.dll引用一个本机.a库时,却没有正确地引用这个库。这将立即杀死应用程序,没有机会让你处理它。
https://stackoverflow.com/questions/69616634
复制相似问题