2011-10-28 27 views
7

Tôi đang cố gắng chuyển ngoại lệ cho hoạt động có nghĩa là đổ thông tin liên quan đến màn hình.Vượt qua ngoại lệ dưới dạng bưu kiện

Hiện nay tôi vượt qua nó thông qua một gói:

try { 
    this.listPackageActivities(); 
} catch (Exception e) { 
    Intent intent = new Intent().setClass(this, ExceptionActivity.class).putExtra("Exception", e); 
    startActivity(intent); 
} 

Nhưng khi nó được có:

if (!(this.bundle.getParcelable("Exception") != null)) 
    throw new IndexOutOfBoundsException("Index \"Exception\" does not exist in the parcel." + "/n" 
    + "Keys: " + this.bundle.keySet().toString()); 

ngoại lệ ngọt ngào này được ném nhưng khi tôi nhìn vào keySet và chi tiết gói nó nói tôi rằng có một đối tượng có thể chuyển nhượng với một khóa có tên là "Ngoại lệ".

Tôi hiểu rằng điều này có liên quan đến các loại nhưng tôi không hiểu những gì tôi đang làm sai. Tôi chỉ muốn kết xuất thông tin về một ngoại lệ, ngoại lệ cho màn hình. Có cách nào để làm điều đó mà không cần phải ngưng tụ tất cả các thông tin vào một chuỗi mỗi lần?

Trả lời

14

Tôi loạng choạng về câu hỏi này khi tôi đang tìm kiếm một phương pháp để vượt qua ngoại lệ từ một dịch vụ cho một hoạt động. Tuy nhiên, tôi đã tìm thấy một phương pháp tốt hơn, bạn có thể sử dụng phương thức putSerializable() của lớp Bundle.

Để thêm:

Throwable exception = new RuntimeException("Exception"); 
Bundle extras = new Bundle(); 
extras.putSerializable("exception", (Serializable) exception); 

Intent intent = new Intent(); 
intent.putExtras(extras); 

Để lấy:

Bundle extras = intent.getExtras(); 
Throwable exception = (Throwable) extras.getSerializable("exception"); 
String message = exception.getMessage(); 
2

Ngoại lệ của lớp không triển khai giao diện Parcelable. Trừ khi Android đang phá vỡ một số cấu trúc Java cơ bản mà tôi không biết, điều này có nghĩa là bạn không thể đặt Ngoại lệ làm bưu kiện thành một Gói.

Nếu bạn muốn "chuyển" hành động sang một Hoạt động mới, chỉ cần tổng hợp các khía cạnh của nó mà bạn sẽ cần trong Hoạt động mới của mình. Ví dụ, giả sử bạn chỉ muốn truyền thông điệp ngoại lệ và stacktrace. Bạn muốn để một cái gì đó như thế này:

Intent intent = new Intent().setClass(this,ExceptionActivity.class) 
intent.putExtra("exception message", e.getMessage()); 
intent.putExtra("exception stacktrace", getStackTraceArray(e)); 
startActivity(intent); 

nơi getStackTraceArray trông như thế này:

private static String[] getStackTraceArray(Exception e){ 
    StackTraceElement[] stackTraceElements = e.getStackTrace(); 
    String[] stackTracelines = new String[stackTraceElements.length]; 
    int i =0; 
    for(StackTraceElement se : stackTraceElements){ 
    stackTraceLines[i++] = se.toString(); 
    } 
    return stackTraceLines; 
} 
+0

Haha, tôi không nên giả định. Có cách nào tốt hơn để truyền thông tin cho hoạt động này không? –

+0

làm cho một: public class ParcelableException mở rộng Exception thực hiện Parcelable {...} – yorkw

+0

Cập nhật câu trả lời của tôi để giải quyết vấn đề này. –

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