我有一个原生的Xamarin Android应用程序,它会在IntentService中抛出异常。当异常发生时,调用堆栈无法确定我在执行中的位置(IntentServices在一个单独的线程中运行,我猜?)。
Xamarin应用程序中是否有任何好处可以捕获这些例外情况?
PS:如果你想知道为什么我不把它放在IntentService中,那是因为它位于第三方lib中。 我可以注入我自己的课程并避免这种情况,但我宁愿直接使用Lib并找到一个适当的位置来捕获它。
答案 0 :(得分:3)
我会从你的第三方库中继承IntentService
并尝试/ catch in service方法覆盖,因为它渗透到Application
是一个真正的代码气味......
否则你需要继承Application
并添加AndroidEnvironment.UnhandledExceptionRaiser
个人:
[Application]
public class MyApplication : Application
{
public MyApplication(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) { }
public MyApplication() { }
public override void OnCreate()
{
base.OnCreate();
AndroidEnvironment.UnhandledExceptionRaiser += HandleEventHandler;
}
void HandleEventHandler(object sender, RaiseThrowableEventArgs e)
{
switch (e.Exception)
{
case AndroidException ae:
Log.Error("SO", ae.ToString());
Log.Error("SO", ae.StackTrace);
Log.Error("SO", ae.InnerException?.ToString());
Log.Error("SO", ae.InnerException?.StackTrace);
e.Handled = true; //?????
break;
default:
break;
}
}
}
应用级的问题是您服务的例外情况?如果是这样你只是埋葬它(e.Handled = true)?否则你要做什么,标记它是否处理?
当然这假设您没有在应用程序级别使用崩溃报告者,恕我直言......这是错误的...