【问题标题】:Java - Throwable to ExceptionJava - 可抛出异常
【发布时间】:2012-09-10 20:45:01
【问题描述】:

我目前正在使用 play2 框架。

我有几个类正在抛出 exceptions,但 play2s 全局 onError 处理程序使用 throwable 而不是异常。

例如,我的一门课正在抛出NoSessionException。如果它是NoSessionException,我可以检查可投掷对象吗?

【问题讨论】:

  • Throwable 是所有异常的超类。你可以catch 一个 throwable,然后询问它的类,看看它是不是 NoSessionException 还是什么。
  • 谢谢大家的快速回答。
  • 当然,您也可以专门捕获 NoSessionException,然后将其传递给期望 Throwable 的接口——因为 Throwable 是接口将接受 NoSessionException 的超类。
  • (如果你确实捕获了所有 Throwables,你不应该简单地忽略那些你没有选择的,而是应该重新抛出它们。)

标签: java exception throwable


【解决方案1】:

简单地说。我们可以将Throwable 传递给Exception 构造函数。

 @Override
 public void onError(Throwable e) {
    Exception ex = new Exception(e);
 }               

在 Android 中查看此 Exception

【讨论】:

  • 堆栈跟踪数据丢失了但是这样做:-(
  • @BrianKnoblauch Android 还提供了另一个构造函数来保留 StackTrace。异常(字符串消息,Throwable 原因,布尔 enableSuppression,布尔 writableStackTrace)
【解决方案2】:

您可以使用instanceof 来检查它是否属于NoSessionException

例子:

if (exp instanceof NoSessionException) {
...
}

假设 expThrowable 引用。

【讨论】:

    【解决方案3】:

    我可以检查一个可抛出的对象是否是 NoSessionException 吗?

    当然:

    Throwable t = ...;
    if (t instanceof NoSessionException) {
        ...
        // If you need to use information in the exception
        // you can cast it in here
    }
    

    【讨论】:

      【解决方案4】:

      Throwable 是一个类,它是Exception - 以及它的所有子类 - 子类。没有什么能阻止您在 Throwable 上使用 instanceof

      【讨论】:

        【解决方案5】:

        除了检查它是否为instanceof,您还可以使用try catch 和catch NoSessionException

        try {
            // Something that throws a throwable
        } catch (NoSessionException e) {
            // Its a NoSessionException 
        } catch (Throwable t) {
            // catch all other Throwables
        }
        

        【讨论】:

          猜你喜欢
          • 2012-07-23
          • 2012-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-24
          • 2018-09-18
          • 2011-02-07
          • 2016-08-10
          相关资源
          最近更新 更多