在java中捕获异常时,是否有将异常转换为新类型的用例?或者是标准的
throw new DiffException(e)唯一的办法就是。如果我忽略了什么,我道歉,但我得到的唯一搜索结果是"ClassCastExceptions“,这显然不是我要找的
发布于 2010-11-14 05:41:46
我相信你指的是'exception wrapping'。没有其他方法可以做到这一点-使用构造函数创建一个新的Exception实例,该构造函数将另一个异常作为原因。这要归功于1-arg constructor of java.lang.Exception。自定义异常类型的典型实现(如您的DiffException)也声明了这样的1-arg构造函数。
发布于 2010-11-14 05:42:08
好吧,如果捕获的异常(我想在您的例子中是e)是DiffException的一个子类型,那么您当然可以将它转换为
throw (DiffException) e;但我怀疑这是您想要做的事情,因为这不会有什么不同(即使在接收端,e仍然具有相同的运行时类型)。
所以答案很可能是, no ,没有其他等价的方法
throw new DiffException(e);而不是这么做。
然而,应该注意的是,执行new DiffException(e)并不称为强制转换,而是包装或链接异常。
发布于 2010-11-14 06:17:21
由于您提到了用例,Java中的常见用例是将已检查的异常包装为未检查的异常;当已检查的异常不可能发生时,这是合适的,例如:
public static Reader getUTF8Reader(InputStream is) {
try {
return new InputStreamReader(inputStream, "UTF-8");
} catch(UnsupportedEncodingException e) {
// should never happen since UTF-8 is guaranteed to be available as per
// http://download.oracle.com/javase/6/docs/api/java/nio/charset/Charset.html
throw new RuntimeException("UTF-8 not available", e);
}
}如果不包装异常,您要么不得不接受它(这感觉是错误的),要么将该方法声明为throws UnsupportedEncodingException,这将迫使任何使用它的人捕获永远不会抛出的异常。总而言之,调用者没有责任处理不太可能的情况,但我们在不太可能的情况下得到了保护,即UTF-8在未来的一些不知名的平台上不可用。
https://stackoverflow.com/questions/4174869
复制相似问题