2012-01-29 30 views
6

Trong lớp Ứng dụng của tôi, tôi cố gắng bắt một lực gần trước khi nó xảy ra, vì vậy tôi có thể đăng nhập và sau đó thử lại để android có thể xử lý nó. Tôi làm điều này vì một số người dùng không báo cáo lực lượng đóng.Rethrow UncaughtExceptionHandler Ngoại lệ sau khi đăng nhập

Tôi đang phát triển trong nhật thực và nhật thực không cho phép tôi tính lại ngoại lệ. Nó cho thấy một lỗi nói rằng "Loại trừ ngoại lệ loại Throwable: Surround với try/catch". Làm thế nào tôi có thể rút lại ngoại lệ?

public class MainApplication extends Application 
{ 
    @Override 
    public void onCreate() 
    { 
    super.onCreate(); 

    try 
    { 
     //Log exception before app force closes 
     Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
      @Override 
      public void uncaughtException(Thread thread, Throwable ex) { 
       AnalyticsUtils.getInstance(MainApplication.this).trackEvent(
         "Errors",      // Category 
         "MainActivity",     // Action 
         "Force Close: "+ex.toString(), // Label 
         0);        // Value 
       AnalyticsUtils.getInstance(MainApplication.this).dispatch(); 

       Toast.makeText(MainApplication.this, "Snap! Something broke. Please report the Force Close so I can fix it.", Toast.LENGTH_LONG); 

       //rethrow the Exception so user can report it 
       //throw ex; //<-- **eclipse is showing an error to surround with try/catch** 
      } 
     }); 

    } catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

}

Trả lời

12

Xin lỗi, không phải là một chuyên gia Android - nhưng có vẻ như bạn không thể ném cũ vì phương pháp chữ ký của bạn "void uncaughtException (Chủ đề, Throwable)" không tuyên bố rằng nó "ném" bất cứ điều gì.

Giả sử bạn đang ghi đè giao diện API và (a) không thể sửa đổi chữ ký này và (b) không muốn vì bạn sẽ ném nó ra khỏi ngữ cảnh, thay vào đó bạn có thể sử dụng mẫu trang trí và về cơ bản phân lớp thực hiện UncaughtExceptionHandler mặc định để đăng nhập thông báo của bạn và sau đó để cho nó tiếp tục xử lý như bình thường?

Edit: chưa được kiểm tra, nhưng điều này có thể trông hơi giống:

final UncaughtExceptionHandler subclass = Thread.currentThread().getUncaughtExceptionHandler(); 
    Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
     @Override 
     public void uncaughtException(Thread thread, Throwable ex) { 
      // your code 
      AnalyticsUtils.getInstance(MainApplication.this).trackEvent(
        "Errors",      // Category 
        "MainActivity",     // Action 
        "Force Close: "+ex.toString(), // Label 
        0);        // Value 
      AnalyticsUtils.getInstance(MainApplication.this).dispatch(); 
      Toast.makeText(MainApplication.this, "Snap! Something broke. Please report the Force Close so I can fix it.", Toast.LENGTH_LONG).show(); 

      // carry on with prior flow 
      subclass.uncaughtException(thread, ex); 
     } 
    }); 
+0

Hmm Tôi nghĩ bạn nói đúng. Tôi không quen với Mẫu trang trí, bạn có thể hiển thị một số mã để chỉ cho tôi cách tôi có thể làm điều này không? –

+0

Yup đã hoạt động! Cảm ơn Capn Sparrow. (Lưu ý: Bánh mì nướng không hiển thị.) –

+0

Bit trễ ở đây nhưng như tôi vừa mới sử dụng giải pháp của Capn Sparrow tôi nên chỉ ra các bánh mì nướng không hiển thị vì có bây giờ .show() ở phần cuối của cuộc gọi makeText. Điều này khiến tôi rất thường xuyên. – AJ87uk

0

Tôi không chắc chắn chính xác nếu đây là những gì bạn muốn, tuy nhiên bạn có thể thêm một điều khoản finally mà sẽ chạy sau hoặc là một thành công try hoặc được xử lý catch:

try { 
    //your code 
} catch (Exception e) { 
    //print stack trace 
} finally { 
    //Log 
} 
+0

Không hoàn toàn những gì tôi đang tìm kiếm, như tôi muốn một "bắt tất cả" mà sẽ đăng nhập bất kỳ ngoại lệ trước khi nó buộc đóng ứng dụng của tôi. Tôi sử dụng try/catches nhưng chỉ trong trường hợp một cái gì đó bị bắt. –

0

Tôi nghĩ mã sau đây sẽ hoạt động. Thực thi mã xử lý bằng cách sử dụng một Thread mới cho phép ứng dụng hiển thị cảnh báo/bánh mì nướng và thực hiện các hoạt động khác.

Ngoài ra, bạn có thể thử gọi System.exit(0) ngay trước khi thoát run(). Điều này khởi động lại hoạt động cuối cùng.

Tôi đã kiểm tra điều này trên cả hai Bánh mì gừng cũng như Jelly Bean.

final UncaughtExceptionHandler subclass = Thread.currentThread().getUncaughtExceptionHandler(); 
    Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
     @Override 
     public void uncaughtException(Thread thread, Throwable ex) { 
      new Thread() { 
       @Override 
       public void run() { 
        Looper.prepare(); 
        // your code 
        AnalyticsUtils.getInstance(MainApplication.this).trackEvent(
          "Errors",      // Category 
          "MainActivity",     // Action 
          "Force Close: "+ex.toString(), // Label 
          0);        // Value 
        AnalyticsUtils.getInstance(MainApplication.this).dispatch(); 
        Toast.makeText(MainApplication.this, "Snap! Something broke. Please report the Force Close so I can fix it.", Toast.LENGTH_LONG); 

        Looper.loop(); 
       } 
      }.start(); 
     } 
    }); 
Các vấn đề liên quan