2014-11-25 32 views
9

Tôi đã thu thập Internet trong một thời gian khá lâu với hy vọng giải pháp và tôi đã gặp một số câu trả lời, nhưng không có câu trả lời nào trong số này dường như đạt được những gì tôi muốn.Đấu tranh để hiểu Xamarin xử lý ngoại lệ

Tôi đang cố xử lý các ngoại lệ mà không khiến ứng dụng gặp sự cố. Thay vì ứng dụng chỉ đơn giản là thoát, tôi thà chụp ngoại lệ, trình bày cho người dùng một lỗi thân thiện với người dùng hơn (có thể là cảnh báo hộp thư) và cho phép họ tiếp tục hoạt động trong ứng dụng.

Có thể dừng ứng dụng khỏi tính toán không?

Con đường tôi hiện đang cố gắng để bắt này là như sau:

public class Login : Activity 
{ 
    int count = 1; 
    Session mySession; 

    protected override void OnCreate(Bundle bundle) 
    { 
     AndroidEnvironment.UnhandledExceptionRaiser += HandleAndroidException; 

      base.OnCreate(bundle); 

      // Set our view from the "main" layout resource 
      SetContentView(Resource.Layout.Login); 


      Button button = FindViewById<Button>(Resource.Id.Login); 
      string accountCode = Resource.Id.AccountCode.ToString(); 
      string password = Resource.Id.Password.ToString(); 

      // button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); }; 
      button.Click += delegate 
      { 
        throw new Exception("LETS THROW A RANDOM EXCEPTION"); 

      }; 

    } 


    void HandleAndroidException(object sender, RaiseThrowableEventArgs e) 
    { 
     Log.Error("INTERNAL DEBUG", "PLEASE HANDLE MY EXCEPTION!"); 
     e.Handled = true; 
     System.Console.Write("YOU'VE JUST BEEN HANDLED!"); 
    } 
} 

Như bạn có thể thấy tôi đang ném một ngoại lệ chung và cố gắng nắm bắt điều này với một UnhandledExceptionRaiser. Tôi đã sử dụng tài liệu này làm tài liệu tham khảo: http://androidapi.xamarin.com/index.aspx?link=E%3AAndroid.Runtime.AndroidEnvironment.UnhandledExceptionRaiser

Tôi có thể tìm thấy thư của mình trong công cụ "Đăng nhập thiết bị Android", tuy nhiên nó đang được kích hoạt SAU KHI xuất hiện lỗi ngoại lệ. Tôi nghĩ điều này có nghĩa là thứ gì đó bên trong Xamarin đang có vết nứt đầu tiên ở ngoại lệ và rơi xuống. Chắc chắn phải có một cách để ngăn chặn điều này?

Tôi đã thấy vô số ví dụ trực tuyến nơi mọi người đã đặt câu hỏi tương tự và không có giải pháp rõ ràng. Một số người đã cung cấp một số giải pháp, nhưng những điều này không thực sự làm những gì tôi đã dự đoán.

Đó là nghĩa đen boggling với tôi nếu điều này không thể được thực hiện.

Đây là lần đầu tiên tôi sử dụng Xamarin và cũng là lần đầu tiên tôi phát triển ứng dụng dành cho thiết bị di động để tôi xin lỗi nếu tôi không biết gì về bất cứ điều gì.

Xin vui lòng trợ giúp !!!

Trả lời

9

Có một điều quan trọng bạn phải hiểu về bản chất của một ngoại lệ Unhandled trong Android, không có một .... trong khung Android sử dụng Java nó là một ngoại lệ Uncaught có nghĩa là bạn không thể "xử lý "nó hoặc phục hồi từ nó như bạn có thể sẽ trong một môi trường. Net. Xamarin (Mono) trong nội bộ "xử lý" những trường hợp ngoại lệ vô hình bằng cách bao quanh tất cả mọi thứ theo nghĩa đen với try-catch và nâng cao sự kiện Unhandled nhưng đó là ngoài điểm. Nó cũng không được khuyến khích để tương tác với giao diện người dùng cũng vì nhiều lý do. Về mặt lý thuyết có một số cách giải quyết "" để hiển thị hộp thoại cho người dùng hoặc khởi động lại ứng dụng, không có cách nào tôi khuyên bạn nên thực hiện. Thay vào đó, bạn nên bao quanh các vùng nhạy cảm với các mệnh đề try-catch để xử lý các ngoại lệ được mong đợi, như đối với trường hợp bất ngờ chỉ sử dụng một thành phần báo cáo ngoại lệ và cập nhật ứng dụng của bạn sau khi phân tích các ngoại lệ được báo cáo.

Ngoài ra, tôi sẽ chuyển đăng ký sự kiện vào lớp học Application nhưng đó là tùy chọn cá nhân. Giống như vậy:

public class YourAppClass : Application 
{ 
    public override void OnCreate() 
    { 
     AndroidEnvironment.UnhandledExceptionRaiser += HandleAndroidException; 
    } 
} 
+0

Cảm ơn Alex. Đánh giá cao phản hồi. Bạn có thể cho tôi một đề xuất hoặc hai đề xuất cho một số thành phần báo cáo không? Bạn có thể dành một phút để cũng xây dựng trên bằng cách sử dụng lớp Ứng dụng và cấu trúc lớp cơ bản bạn muốn trong suốt ứng dụng? cảm ơn! –

+0

Các thành phần là HockeyApp và Raygun (là những cái tôi đã làm việc cùng). http://components.xamarin.com/gettingstarted/hockeyappandroid https://components.xamarin.com/view/raygun4net Và đối với lớp Ứng dụng, hãy xem câu trả lời đã chỉnh sửa của tôi. –

+0

Cảm ơn Alex Tôi chắc chắn sẽ kiểm tra chúng. Vì vậy, khái niệm chung là tạo ra một lớp Ứng dụng và sau đó mỗi hoạt động thực hiện lớp ứng dụng? Xin lỗi - mới với Xamarin/mobile dev! –