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;
}
};
问题
什么是异常类型(如果超过托管/非托管),我如何捕获所有内容?
答案 0 :(得分:1)
不用说,全球'异常处理程序不应该替代正确捕获预期会遇到问题的代码块的预期或预期异常(可能是因为您使用并行库,或任何具有任何线程复杂性的东西)。
'全球'异常处理程序(在我看来)应该用于捕获您在开发和测试期间未能发现的任何内容。我个人将这些文件写入我们应用程序的日志文件中,并将其作为“关键异常”处理。因为它们会导致应用程序崩溃。我首选的方法是将事件分配给' AppDomain.CurrentDomain.UnhandledException'。
在开发,测试期间以及如果在生产期间,您的应用程序的用户碰巧具有诊断报告功能。设置为on您将能够访问apples异常日志。这些可能很有用,但请记住,它们会给你“本地人”。堆栈跟踪并且不会在其中包含任何特定于xamarin的内容。所以带上一点盐就可以了。
关于你的问题,分配给' AppDomain.CurrentDomain.UnhandledException'将捕捉您未完成或预测的每一个例外情况。你不需要明确地知道类型,因为堆栈跟踪显然会告诉你它们是什么。同样值得注意的是,您只能使用该事件来记录信息或执行非常基本的功能,因为无论您做什么,应用程序都会关闭。因此,使用它来记录尽可能多的有关您的应用程序的信息。
如果应用程序遇到unhandledexception事件,目前无法阻止你的应用程序关闭。