将例外作为包裹传递

时间:2011-10-28 19:31:19

标签: android

我正在尝试将异常传递给旨在将相关信息转储到屏幕的活动。

目前我通过捆绑传递:

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

但是当它到达那里时:

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

抛出了这个甜蜜的异常,但是当我查看keySet和bundle的详细信息时,它告诉我有一个带有名为“Exception”的键的可分配对象。

我知道这与类型有关,但我不明白我做错了什么。我只想转储有关异常的信息,屏幕上的任何异常。有没有办法做到这一点,而不必每次都将所有信息压缩成一个字符串?

2 个答案:

答案 0 :(得分:14)

当我在寻找将异常从服务传递到活动的方法时,我偶然发现了这个问题。但是,我发现了一个更好的方法,你可以使用Bundle类的putSerializable()方法。

添加:

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

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

要检索:

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

答案 1 :(得分:4)

类Exception未实现Parcelable接口。除非android打破了一些我不知道的基本Java构造,否则这意味着你不能将一个Exception作为一个包裹放入一个包中。

如果你想将execption“传递”给一个新的Activity,只需将你在新Activity中需要的方面捆绑起来。例如,假设您只想传递异常消息和堆栈跟踪。你会这样:

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

其中getStackTraceArray如下所示:

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