This link描述了iOS中如何处理异常
Runtime.MarshalManagedException += (object sender, MarshalManagedExceptionEventArgs args) =>
{
Console.WriteLine ("Marshaling managed exception");
Console.WriteLine (" Exception: {0}", args.Exception);
Console.WriteLine (" Mode: {0}", args.ExceptionMode);
};
Runtime.MarshalObjectiveCException += (object sender, MarshalObjectiveCExceptionEventArgs args) =>
{
Console.WriteLine ("Marshaling Objective-C exception");
Console.WriteLine (" Exception: {0}", args.Exception);
Console.WriteLine (" Mode: {0}", args.ExceptionMode);
};
此外,我还看到其他 Xamarin 示例在 AppDelegate 中使用了它
AppDomain.CurrentDomain.UnhandledException += (sender, e) => {
try
{
var exception = ((Exception)e.ExceptionObject).GetBaseException();
Console.WriteLine("**SPORT UNHANDLED EXCEPTION**\n\n" + exception);
exception.Track();
}
catch
{
throw;
}
};
问题
异常类型有哪些(如果多于托管/非托管),以及如何捕获所有内容?
最佳答案
不言而喻,“全局”异常处理程序不应取代从您预计会出现问题的代码块中正确捕获预期或预期的异常(可能是因为您使用并行库或任何类型的任何内容)线程复杂度)。
“全局”异常处理程序(在我看来)应该用于捕获在开发和测试过程中未能发现的任何内容。就我个人而言,我将这些写入应用程序中的日志文件,并将它们作为“严重异常”处理,因为它们会导致应用程序崩溃。我的首选方法是将事件分配给“AppDomain.CurrentDomain.UnhandledException”。
话虽这么说,在开发、测试过程中,如果在生产过程中应用程序的用户碰巧将“诊断报告”设置为打开状态,您将能够访问苹果异常日志。这些可能很有用,但请记住,它们将为您提供“ native ”堆栈跟踪,并且其中不会包含任何特定于 xamarin 的内容。所以,要带着一点盐来看待它们。
关于你的问题,分配给“AppDomain.CurrentDomain.UnhandledException”将捕获你自己没有做过或预见到的所有异常。您不需要明确地知道类型,因为堆栈跟踪会清楚地告诉您它们是什么。还值得注意的是,您只能使用该事件来记录信息或执行非常基本的功能,因为无论您做什么,应用程序都会关闭。因此,请使用它来记录尽可能多的有关您的应用程序的信息。
如果应用程序遇到 unhandledException 事件,目前无法阻止应用程序关闭。
关于xamarin - 如何在 Xamarin 中可靠地捕获*所有* iOS 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43741544/