java - 链接异常,捕获异常并抛出新异常

标签 java exception checked-exceptions

将以下代码想象为某个程序 (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/

相关文章:

java - JodaTime 非法参数异常 : Invalid format

java - 为什么应该尝试抛出未经检查的异常而不是已检查的异常?

java - 在原型(prototype)制作时自动添加/删除已检查的异常

java - 将 matplotlib (Python) 与 Android Studio 集成

java - 路径元素包含条件

java - 装饰一个继承 protected 可观察对象的类

java - amazon simple workflow-并行处理任务,只有在前一阶段的所有并行过程完成后才进入下一阶段

python - 异常处理程序位于单独模块中的异常

java - Android拦截未处理的异常

java - Java异常从何而来?