Java - 如何将throwable转换为新的throwable并将其抛出?

时间:2015-05-28 07:44:14

标签: java rx-java

当发生异常并且我得到Throwable时,我想将其转换为MyThrowable并重新抛出它。

我正在实例创建

上实现一个方法
   obs1 = obs1.map(new Func1<Integer, Integer>() {
            public Integer call(Integer integer) {
             try {
                    getObj().equals(""); // an exception occurs
                    return ++integer;
                } catch (Throwable t) {
//                    t = new MyThroawable("",""); // if this is unmarked - failes to compile
                    throw t;
                }
            }
        });
  • 我需要处理Throwable因为我的反应性fw(rxJava)在错误时返回throwable

从新的Throwable创建移动注释时得到的编译错误

java: unreported exception async.job.MyThroawable; must be caught or declared to be thrown

6 个答案:

答案 0 :(得分:4)

通常,您应该避免从FuncX和ActionX实例中抛出异常,并且不能直接抛出已检查的异常。

但是,如果您希望通过API引发已检查异常的映射,则可以使用flatMap返回常规值observable或者可观察到错误:

source.flatMap(integer -> {
    try {
        getObj().equals("")
        return Observable.just(++integer);
    } catch (Throwable t) {
        return Observable.error(OnErrorThrowable.addValueAsLastCause(t, integer));
    }
})

答案 1 :(得分:2)

您应该使用异常链接:

} catch (Throwable t) {
     throw new MyThroawable("Something failed", t);
}

你还应该include useful information in your message,这将有助于确定出错的地方(比如你工作的对象)。

  

java:未报告的异常async.job.MyThroawable

Java不允许您在不声明的情况下抛出已检查的异常。这是old debate

修复方法是将throws MyThroawable添加到方法中(然后修复您将在其他地方获得的数百个编译错误)或使MyThroawable扩展RuntimeException(推荐)

答案 2 :(得分:0)

你不能一个接一个地抛出两个抛出语句。

抛出自定义异常:

     public Integer call(Integer integer) throws MyThroawable 
     {
         try {
             getObj().equals(""); // an exception occurs
             return ++integer;
         } catch (Throwable t) {
             throw new MyThroawable("","");
         }
     }

您可能希望将原始Throwable t传递给自定义异常的构造函数。

此外,如果MyThrowable是已检查的例外,则必须向public Integer call(Integer integer)方法添加throws子句。

答案 3 :(得分:0)

我猜你的Throwable延伸了Throwable :)。 Throwable类的构造函数之一(您的类也应该具有)是一个接收另一个Throwable异常的构造函数。所以你只是这样做:

抛出新的MyThrowable(t);

答案 4 :(得分:0)

你的问题是方法可以抛出的每个Throwable(RuntimeExceptions除外)必须使用throws关键字在方法声明中声明。所以理想的方法是更改​​

public Integer call(Integer integer) { ...

public Integer call(Integer integer) throws MyThrowable  { ...

但是,由于此方法未在Func1中定义,因此您会收到一条错误消息,指出overridden method does not throw Exception。因此,您最好的选择可能是使用闭包,即在call - 函数之外声明一些变量,将异常存储在那里并在调用map之外重新抛出它。这看起来像这样:

Throwable t = null;

obs1 = obs1.map(new Func1<Integer, Integer>() {
  public Integer call(Integer integer) {
    try { ... }
    catch (Throwable t) { outerThrowable = t; }
  }
});

if(t != null) {
  throw new MyThroawable("", "");
}

请记住在周围的方法中声明throws MyThrowable,否则你会在那里得到同样的错误。

修改:正如Aaron指出的那样,也可以让MyThrowable延长RuntimeException而不是Throwable。在这种情况下,您可以直接在map - 函数中重新抛出它们。但是,您必须将其记录在某处,以便在方法的调用者突然抛出异常时不会惊讶。这是一个很好的设计选择,所以你必须决定。

答案 5 :(得分:0)

当您使用RxJava时,您可以使用RxJava异常来保留抛出异常的值:

throw OnErrorThrowable.addValueAsLastCause(e, file);

所以在你的代码中:

 obs1 = obs1.map(new Func1<Integer, Integer>() {
        public Integer call(Integer integer) {
         try {
                getObj().equals(""); // an exception occurs
                return ++integer;
            } catch (Throwable t) {
                throw OnErrorThrowable.addValueAsLastCause(t, integer);
            }
        }
    });