在哪里捕获IntentService异常以避免因UnhandledException导致崩溃?

时间:2018-03-16 22:41:18

标签: c# .net xamarin xamarin.android

我有一个原生的Xamarin Android应用程序,它会在IntentService中抛出异常。当异常发生时,调用堆栈无法确定我在执行中的位置(IntentServices在一个单独的线程中运行,我猜?)。

Xamarin应用程序中是否有任何好处可以捕获这些例外情况?

PS:如果你想知道为什么我不把它放在IntentService中,那是因为它位于第三方lib中。 我可以注入我自己的课程并避免这种情况,但我宁愿直接使用Lib并找到一个适当的位置来捕获它。

1 个答案:

答案 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)?否则你要做什么,标记它是否处理?

当然这假设您没有在应用程序级别使用崩溃报告者,恕我直言......这是错误的...