在Java中,有可能重新抛出异常,但这样做有什么好处吗?
当您不知道如何处理异常,但希望记录异常被抛出时,需要重新抛出异常。重新抛出异常允许您捕获需要记录的堆栈信息,并将异常传递到调用者处理。
当您需要对异常进行特殊处理(例如日志记录、清理等)但不能完全“处理”它时,通常会先进行处理然后再重新抛出异常。请注意,在许多情况下(尤其是清理资源时),您可能需要使用finally子句而不是catch/rethrow。
以下是我在实际工作中需要重新抛出Java异常的一些情况:
public bizMethod() throws CoolBizLogicException {
int policyId = getPolicyId("bar");
try {
coolBizLogic(foobar); // this throws an exception
}
catch (CoolBizLogicException cble) {
cble.setPolicyId(policyId);
throw cble;
}
}
我已经好几年没写Java了,但是从我记得的来看,它就像其他语言一样有异常和面向对象编程。异常可以被子类化,通常情况下,你会想要捕获许多异常的基类,但可能无法处理所有异常。所以说,假设你正在处理远程文件传输,并且想要捕获所有的IOErrors,因为你可以处理其中大部分,但不能处理DiskFull。你可以重新抛出该异常,让上层代码处理,但需要重新执行传输来处理其他问题,例如TransmissionFailed。
如果你能以某种方式证明需要重新抛出捕获到的同一异常,我会认为你的设计存在问题。
捕获一个异常并重新抛出另一个异常是很有道理的。例如,您可能希望添加原始异常中没有的详细信息。
我不这么认为。如果你处理不了,就别去捕捉它。