【发布时间】:2019-02-19 16:54:31
【问题描述】:
我有一种情况需要调用foo方法,如果调用bar方法失败,则重新抛出原来的异常(包装)。
我的问题是bar方法也可能失败,它的异常信息也很重要。
当我创建一个新异常时,只有一个原因,我有两个。我可以创建类似class MyException(cause1, cause2) extends RuntimeException(cause1) 的东西,但cause2 将超出异常所具有的标准机制(堆栈跟踪等)。
有没有更好的方法来处理这种情况?
下面的代码是一个简化的例子。
// I can't change this code
def foo:String = throw new FooException("foo method fails")
def bar:String = throw new BarException("bar method fails")
// my code
try {
foo
} catch {
case error1:FooException =>
try {
// if foo fails, I want to call bar
bar
throw new MyException("my exception", error1)
} catch {
case error2:BarException =>
// but bar could fail too
throw new MyException("my exception", ???)
// if my cause is error1, I lost error2 information (message and stack)
// if my cause is error2, I lost error1 information (message and stack)
}
}
提前谢谢你。
【问题讨论】:
-
如果
bar成功了会发生什么?是否应该丢弃返回的String以支持抛出foo错误?调用bar是否只是为了产生副作用? -
是的,
bar是插入数据库,在这种情况下,它的返回被丢弃
标签: scala exception-handling try-catch