首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链接异常,捕获异常以抛出新的异常

链接异常,捕获异常以抛出新的异常
EN

Stack Overflow用户
提问于 2016-04-19 22:05:07
回答 2查看 146关注 0票数 0

假设下面的代码是某个程序(Java)的一部分:

代码语言:javascript
复制
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中抛出了异常,并使它们相应地执行。做这件事最好的方法是什么?

代码语言:javascript
复制
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是一个登录()函数。然后函数x会尝试调用login(),要么捕获一个SQLException | NoSuchAlgorithmException,如果让这些异常简单地飞到最高级别,要么捕获一个LoginFailedException,如果我们立即捕获每个异常,并让它们抛出新的异常。似乎捕获LoginFailedException会使代码更具可读性。

Imo这两种方式都有它们的缺点(代码可读性较差,引入了许多异常),我想知道经验丰富的java程序员通常如何处理类似的情况。

任何关于异常的一般想法也很感谢各位

EN

回答 2

Stack Overflow用户

发布于 2016-04-19 22:16:21

当您查看您的代码(以及方法和异常的名称)时,找出这些方法及其抛出的异常是否在同一抽象级别。

如果您有一个getInputStream()方法,那么适当的异常应该是一个IOException。如果在getDatabaseConnection()中调用该方法,则应该捕获IOException并抛出SQLException。如果您的saveCustomerToDatabase()方法需要此方法,那么您应该抛出类似于ProcessFailedException的东西。

我不是一个很喜欢写javadoc的人,但有时你应该问问自己:我能用同样的语言(即技术语言、商业语言等)为这个方法及其异常写出好的javadoc吗?如果saveCustomerToDatabase() -Method抛出IOException,那么为它编写javadoc就会遇到麻烦。

票数 1
EN

Stack Overflow用户

发布于 2016-04-19 22:11:55

如果您对z()方法的当前设计很满意,并且希望y()x()方法“知道”z()中发生了一些不好的事情,那么您可以让z()在吞噬异常之后重新抛出它。

代码语言:javascript
复制
public void z() {
    try {
        // some code here, that might throw exceptions.
    } catch (SomeException | SomeOtherException e) {
        // handle the exception and then rethrow it
        logger.log("An exception happened in z().");
        throw e;
    }
}

public void y() {
    try {
        z();
    } catch(Exception e) {
        // handle problem with z() and rethrow the exception
        logger.log("An exception happened when calling z().");
        throw e;
    }
}

public void x() {
    try {
        y();
    } catch(Exception e) {
        // handle problem with y()
        logger.log("An exception happened when calling y().");
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36720778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档