2015-06-11 23 views
8

Tôi muốn đăng nhập ngoại lệ không được xử lý, nhưng tôi thấy thông tin xung đột về việc và cách thức này có thể thực hiện được hay không.Ghi nhật ký Xamarin unhandled (Android uncaught) ngoại lệ

Tôi hiểu rằng Xamarin đặt ra một sự kiện AndroidEnvironment.UnhandledExceptionRaiser hoặc AppDomain.CurrentDomain.UnhandledException và tôi có thể đăng ký sự kiện này, nhưng tôi cho rằng Android đang giết quá trình của tôi và tôi không có quyền truy cập vào Android.Utils.Log hoặc hệ thống tệp.

Nếu bạn nhìn vào Xamarin's AdvancedAppLifecycleDemos/HandlingCrashes/App.cs có một đối số thuyết phục rằng bạn không thể ghi ngoại lệ này.

/// <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); 
    } 

Vậy làm cách nào để thoát ngoại lệ?

+0

Hi Adam! Bạn đã từng nhìn thấy chủ đề này chưa? https://forums.xamarin.com/discussion/13784/catching-global-exceptions-in-android lưu ý thực tế là 'Console.Writeline' dường như không hoạt động nhưng' Android.Util.Log.Debug' Là. –

+0

Tôi không thấy chủ đề đó cụ thể, nhưng tôi vẫn theo ấn tượng rằng Android.Util.Log có thể hoặc có thể không hoạt động vì Android đang tích cực trong quá trình tiêu diệt quy trình của bạn (như được tham chiếu trong https: // github .com/xamarin/monodroid-samples/tree/master/AdvancedAppLifecycleDemos/HandlingCrashes). – Adam

+1

Bạn đã xem Xamarin.Insights chưa? Nó có thể bắt ngoại lệ của bạn unhandled và xử lý sau khi khởi tạo trên mainactivity/appdelegate nhưng dường như có một thương mại tắt trong những hiểu biết làm chậm các ứng dụng đa luồng trên nền tảng Android. –

Trả lời

7

Thông tin chi tiết về Xamarin, HockeyApp hoặc trình ghi nhật ký sự cố khác lưu dữ liệu sự cố bằng cách nào đó trước khi ứng dụng hoàn tất quá trình. Họ gửi dữ liệu đến máy chủ khi ứng dụng được khởi động lại (họ không thể gửi nó ngay lập tức khi quá trình này bị giết). Vì vậy, đó là hoàn toàn có thể. Mặc dù tôi không chắc chắn nếu họ lưu dữ liệu tai nạn để lưu trữ thiết bị (có lẽ nhiều nhất) hoặc đến một cơ sở dữ liệu SQLite cục bộ.

Mã này HockeyApp sử dụng để nắm bắt các ngoại lệ chưa được xử lý. Nó có thể cung cấp cho bạn một số ý tưởng:

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); 

tôi sẽ đề nghị để thử và viết một tập tin văn bản để lưu trữ địa phương trong bất kỳ của những phương pháp

0

Xamarin Insights là những gì bạn cần: https://xamarin.com/insights

Với Xamarin Insights bạn có thể nhìn thấy một cái nhìn tổng quan hoàn chỉnh của bất kỳ tai nạn và xác định loại vấn đề và cảnh báo rằng đang xảy ra trong ứng dụng của bạn

Khi phiên bản cuối cùng Xamarin Studio 5.10 được phát hành, Insights cũng sẽ được tích hợp (Read More).

Các vấn đề liên quan