当发生异常并且我得到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创建移动注释时得到的编译错误
java: unreported exception async.job.MyThroawable; must be caught or declared to be thrown
答案 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);
}
}
});