2013-06-21 44 views
6

Gần đây tôi đã bắt đầu tìm hiểu phát triển di động bằng cách sử dụng Xamarin Android. Tôi đang sử dụng VS 2012. Tôi nhận thấy rằng khi tôi mở một dự án android mà tất cả các trường hợp ngoại lệ theo Debug -> Ngoại lệ được bỏ chọn. Tôi nghĩ rằng đó là lý do mà các ngoại lệ được ném vào mã không được hiển thị theo cách mà tôi đang sử dụng để phát triển từ máy tính để bàn. Khi tôi kiểm tra các ngoại lệ trong cửa sổ Debug-> Exceptions và cố gắng triển khai giải pháp cho trình giả lập nó không thành công - không có lỗi nhưng ứng dụng không khởi động trên trình mô phỏng.Trường hợp ngoại lệ khi sử dụng Xamarin Android

Vì vậy, câu hỏi của tôi là: Đó là hành vi bình thường khi phát triển cho Android sử dụng VS 2012 hoặc VS 2010 và trình giả lập? Có cách nào để xem các ngoại lệ được ném theo một 'cách bình thường' không chỉ trong cửa sổ đầu ra. Điều đó có thay đổi nếu tôi sử dụng thiết bị Android thực sự để gỡ lỗi không?

Trả lời

0

Tôi cũng mới sử dụng Xamarin. Câu trả lời đơn giản là không có điều này không phải là những gì bạn mong đợi.

Nếu tôi nhận được ngoại lệ khi ứng dụng đang chạy trên thiết bị, nó sẽ bị hỏng trong Visual Studio. Đặt cược tốt nhất là liên hệ trực tiếp với Xamarin hoặc truy cập diễn đàn.

+0

Cảm ơn câu trả lời của bạn. Có lẽ tôi không đủ rõ ràng. Việc thực thi mã trong studio trực quan không phá vỡ, mà là một cửa sổ chuẩn được sử dụng để khám phá ngoại lệ mà tôi nhận được khi lập trình cho máy tính để bàn, cửa sổ chỉ chứa tên của ngoại lệ được ném, hộp kiểm để vô hiệu hóa ngắt mã khi loại này ngoại lệ được ném và các nút Break, Continue và Ignore. Nhưng tôi không thể khám phá ngoại lệ thực tế theo cách sẵn có khi lập trình cho máy tính để bàn. –

+0

Tôi gặp vấn đề tương tự, bạn có giải quyết được sự cố không? – unarity

5

Có lẽ tôi chưa đủ rõ ràng. Việc thực thi mã trong studio trực quan không phá vỡ, mà là một cửa sổ chuẩn được sử dụng để khám phá ngoại lệ mà tôi nhận được khi lập trình cho máy tính để bàn, cửa sổ chỉ chứa tên của ngoại lệ được ném, hộp kiểm để vô hiệu hóa ngắt mã khi loại này ngoại lệ được ném và các nút Break, Continue và Ignore. Nhưng tôi không thể khám phá ngoại lệ thực tế theo cách sẵn có khi lập trình cho máy tính để bàn.

Trong Debug --> Exceptions hộp thoại, nếu bạn nhấp vào hộp kiểm Thrown cho Common Language Runtime Exceptions bạn sẽ nhận được một bản mô tả có ý nghĩa hơn trong những trường hợp ngoại lệ được giải quyết.

enter image description here

Rõ ràng là vấn đề lớn khác là nhấn vào nút Break và nhìn thấy những gì trên các cuộc gọi stack.

5

trả lời của tôi là NO

Tại sao?

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 Android nó là một ngoại lệ của router có nghĩa là bạn không thể "xử lý "nó hoặc khôi phục 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 ngoại lệ không bị bắt đó theo số bao quanh tất cả mọi thứ theo nghĩa đen với try-catch và tăng Sự kiện chưa xử lý nhưng đó là ngoài điểm. Nó cũng được khuyến khích để tương tác với giao diện người dùng cũng như vì nhiều lý do khác nhau.

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ó điều nào tôi khuyên bạn nên làm theo số .Thay vào đó bạn nên bao quanh khu vực nhạy cảm với try-catch khoản để xử lý ngoại lệ mong đợi, như đối với việc phân tích các trường hợp ngoại lệ báo cáo một trong những bất ngờ của chỉ cần sử dụng một bộ phận báo cáo ngoại lệ và cập nhật ứng dụng của bạn sau khi

Explation From

bạn cũng có thể bắt ngoại lệ unhadled từ ứng dụng giống như này

Tạo một hoạt động cơ sở như tên ErrorActivity

xem ví dụ này

protected override void OnCreate(Bundle bundle) 
{ 
     //register error handlers 
        AppDomain.CurrentDomain.UnhandledException += ErrorHandler.CurrentDomainOnUnhandledException; 
        TaskScheduler.UnobservedTaskException += ErrorHandler.TaskSchedulerOnUnobservedTaskException; 
    } 

Trong lớp xử lý lỗi

public static class ErrorHandler 
    { 
     /// <summary> 
     ///  Tasks the scheduler on unobserved task exception. 
     /// </summary> 
     /// <param name="sender">The sender.</param> 
     /// <param name="unobservedTaskExceptionEventArgs"> 
     ///  The <see cref="UnobservedTaskExceptionEventArgs" /> instance containing 
     ///  the event data. 
     /// </param> 
     public static void TaskSchedulerOnUnobservedTaskException(object sender, 
      UnobservedTaskExceptionEventArgs unobservedTaskExceptionEventArgs) 
     { 
      var newExc = new Exception("TaskSchedulerOnUnobservedTaskException", 
       unobservedTaskExceptionEventArgs.Exception); 
      LogUnhandledException(newExc); 
     } 

     /// <summary> 
     ///  Currents the domain on unhandled exception. 
     /// </summary> 
     /// <param name="sender">The sender.</param> 
     /// <param name="unhandledExceptionEventArgs"> 
     ///  The <see cref="UnhandledExceptionEventArgs" /> instance containing the event 
     ///  data. 
     /// </param> 
     public static void CurrentDomainOnUnhandledException(object sender, 
      UnhandledExceptionEventArgs unhandledExceptionEventArgs) 
     { 
      var newExc = new Exception("CurrentDomainOnUnhandledException", 
       unhandledExceptionEventArgs.ExceptionObject as Exception); 
      LogUnhandledException(newExc); 
     } 

     /// <summary> 
     ///  Logs the unhandled exception. 
     /// </summary> 
     /// <param name="exception">The exception.</param> 
     internal static void LogUnhandledException(Exception exception) 
     { 
      try 
      { 
       string error = 
        $"Exception Caught:{DateTime.Now:F} The Error Message IS {exception.Message}\n\r full stack trace is {exception.ToString()} "; 
#if DEBUG 
       const string errorFileName = "errorlog.txt"; 
       var libraryPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); 
       // iOS: Environment.SpecialFolder.Resources 
       var errorFilePath = System.IO.Path.Combine(libraryPath, errorFileName); 
       System.IO.File.WriteAllText(errorFilePath, error); 
       Android.Util.Log.Error("Crash Report error not handled", ex.ToString()); 
    #else 
        // Log to Android Device Logging. 
        Android.Util.Log.Error("Crash Report", error); 
    #endif 
       } 
       catch (Exception ex) 
       { 
        Android.Util.Log.Error("Crash Report error not handled", ex.ToString()); 
        // just suppress any error logging exceptions 
       } 
      } 
     } 

Bây giờ bạn có thể kế thừa toàn bộ các activitys từ ErrorActivity như thế này

Public class Fooactivity:ErrorActivity 
{ 
} 

Bây giờ bạn có thể xử lý lỗi trong ứng dụng..Bạn nhận được nhật ký lỗi từ nhật ký Tệp .. hoặc màn hình đăng nhập thiết bị android..Hy vọng điều này sẽ giúp ...

0

Tôi đã có thể tìm hiểu ngoại lệ không được xử lý:

Tiến hành như sau:

  1. Catch kiện AppDomain.CurrentDomain.UnhandledException
  2. Nếu bạn nhìn kỹ, bạn sẽ thấy rằng về cơ bản bằng cách nào đó dịch Java.Lang.Runtime ngoại lệ của nó vì vậy nếu bạn kiểm tra ExceptionObject sở hữu nó sẽ cho bạn thông điệp rất rõ ràng có gì sai với ứng dụng. Trong trường hợp của tôi, nó đã cho tôi một thông điệp rất rõ ràng rằng tôi không gọi số cơ sở OnDestroyView trong số Fragment
Các vấn đề liên quan