记录Xamarin未处理(Android未捕获)异常

时间:2015-06-11 15:56:20

标签: android xamarin xamarin.android

我想记录未处理的例外情况,但我看到有关这是否可能以及如何实现的相互矛盾的信息。

据我所知,Xamarin提出了AndroidEnvironment.UnhandledExceptionRaiserAppDomain.CurrentDomain.UnhandledException事件并且我可以订阅此事件,但我认为Android正在杀死我的进程并且我不会可以访问Android.Utils.Log或文件系统。

如果你看一下Xamarin的AdvancedAppLifecycleDemos/HandlingCrashes/App.cs那就是一个令人信服的论据,你无法记录这个例外。

    /// <summary>
    /// When app-wide unhandled exceptions are hit, this will handle them. Be aware however, that typically
    /// android will be destroying the process, so there's not a lot you can do on the android side of things,
    /// but your xamarin code should still be able to work. so if you have a custom err logging manager or 
    /// something, you can call that here. You _won't_ be able to call Android.Util.Log, because Dalvik
    /// will destroy the java side of the process.
    /// </summary>
    protected void HandleUnhandledException(object sender, UnhandledExceptionEventArgs args)
    {
        Exception e = (Exception)args.ExceptionObject;

        // log won't be available, because dalvik is destroying the process
        //Log.Debug (logTag, "MyHandler caught : " + e.Message);
        // instead, your err handling code shoudl be run:
        Console.WriteLine("========= MyHandler caught : " + e.Message);
    }

那么如何记录未处理的异常呢?

1 个答案:

答案 0 :(得分:7)

Xamarin Insights,HockeyApp或其他崩溃记录程序会在应用程序完成此过程之前以某种方式保存崩溃数据。一旦应用程序重新启动,它们就会将数据发送到服务器(当进程被终止时,它们无法立即发送)。这完全有可能。虽然我不确定他们是否将崩溃数据保存到设备存储(最有可能)或本地SQLite数据库。

这个代码HockeyApp用于捕获未处理的异常。它可以给你一些想法:

AndroidEnvironment.UnhandledExceptionRaiser += (sender, args) =>
{
    TraceWriter.WriteTrace(args.Exception);
    args.Handled = true;
};

AppDomain.CurrentDomain.UnhandledException += (sender, args) => 
    TraceWriter.WriteTrace(args.ExceptionObject);

// Wire up the unobserved task exception handler
TaskScheduler.UnobservedTaskException +=  (sender, args) =>
    TraceWriter.WriteTrace(args.Exception);

我建议尝试在任何这些方法中将文本文件写入本地存储