2

这个链接描述了如何在 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;
  }
};

问题

异常类型是什么(如果超过托管/非托管),我如何捕获所有内容?

4

1 回答 1

2

不言而喻,“全局”异常处理程序不应替代从您预期会遇到问题的代码块中正确捕获预期或预期异常(可能是因为您使用并行库或任何具有任何线程复杂性的东西) )。

“全局”异常处理程序(在我看来)应该用于捕获您在开发和测试期间未能发现的任何内容。我个人将这些写入我们应用程序的日志文件并将它们作为“严重异常”处理,因为它们会导致应用程序崩溃。我的首选方法是将事件分配给“AppDomain.CurrentDomain.UnhandledException”。

话虽如此,在开发、测试和生产过程中,如果您的应用程序用户碰巧设置了“诊断报告”,您将能够访问苹果异常日志。这些可能很有用,但请记住,它们将为您提供“本机”堆栈跟踪,并且其中没有任何特定于 xamarin 的内容。所以带上一小撮盐。

至于您的问题,分配给“AppDomain.CurrentDomain.UnhandledException”将捕获您自己未完成或未预见到的所有异常。您不需要明确知道类型,因为堆栈跟踪显然会告诉您它们是什么。还值得注意的是,您只能使用该事件来记录信息或执行非常基本的功能,因为无论您做什么,应用程序都会关闭。因此,请使用它尽可能多地记录有关您的应用程序的信息。

如果您的应用程序遇到 unhandledexception 事件,目前无法阻止它关闭。

于 2017-05-04T13:18:08.560 回答