将以下代码想象为某个程序 (java) 的一部分:
function z(){
try{
//some code here, that might throw exceptions.
}catch (SomeException | SomeOtherException e){
//some exception handling here.
}
function y(){
z();
}
function x(){
y();
}
想象一下,如果函数 z 中抛出异常 SomeException 或 SomeOtherException,函数 x 和 y 将不会按预期执行。 我们希望编写代码,使函数 x 和 y 知道函数 z 中抛出了异常,并让它们采取相应的行动。 最好的方法是什么?
function z() thrown FunctionZFailedException{
try{
//some code here, that might throw exceptions.
}catch (SomeException | SomeOtherException e){
throw new FunctionZFailedException();
}
}
function y() throws FunctionYFailedException{
try{
z();
}catch (FunctionZFailedException e){
throw new FunctionYFailedException();
}
}
function x(){
try{
y();
}catch (FunctionYFailedException e){
//Do something, like alerting user that something went wrong.
}
}
声明新异常的唯一目的是将其他异常“转发”到更高级别,这是否太过分了?
我认为我们也可以让 SomeException 和 SomeOtherException 飞起来并在函数 x 中捕获它们。但在我看来,这可能会弥补可读性较差的代码,
例如,如果函数 z 中捕获的异常是 SQLException 和 NoSuchAlgorithmException,而函数 y 是一个 login() 函数。然后函数 x 会尝试调用 login(),并且捕获 SQLException | NoSuchAlgorithmException,如果让这些异常简单地飞到最高级别,或者捕获 LoginFailedException,如果我们立即捕获每个异常,并让它们抛出新的异常。看起来捕获 LoginFailedException 可以使代码更具可读性。
我认为这两种方法都有其缺点(可读性较差的代码 vs 引入许多异常),我想知道经验丰富的 java 程序员通常如何处理类似的情况。
任何关于异常(exception)的一般想法也很感激,谢谢大家
最佳答案
当您查看代码(以及方法和异常的名称)时,请查明方法及其抛出的异常是否位于同一抽象级别。
如果您有 getInputStream() 方法,那么相应的异常将是 IOException。如果您在 getDatabaseConnection() 中调用该方法,那么您应该捕获 IOException 并抛出 SQLException。如果您的 saveCustomerToDatabase() 方法需要此方法,那么您应该抛出类似 ProcessFailedException 的内容。
我不太热衷于编写 javadoc,但有时您应该问自己:我是否能够用同一种语言(即技术语言、业务语言等)为该方法及其异常编写良好的 javadoc ?如果 saveCustomerToDatabase() 方法抛出 IOException,那么在为该方法编写 javadoc 时就会遇到麻烦。
关于java - 链接异常,捕获异常并抛出新异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36720778/