应该公布异常的时间以及何时应该处理的Thumb规则

时间:2012-05-16 04:50:11

标签: java exception exception-handling

我有方法x调用其中的另一个名为y的方法,该方法抛出异常MyException。目前我有两个选项,要么宣传我的方法x,例外MyException ...就像

public void x() throws MyException {
// call to y
}

(因为y通过throws子句广告,如此...)

public void y() throws MyException {
// code
}

或者在try catch块的方法y中将调用包装到x并处理它?喜欢这个..

public void x() {
 try {
   // call to y
 } catch (MyException e) {
   // handle exception
 } 
}

拇指规则是什么?

2 个答案:

答案 0 :(得分:1)

如果您的方法可以保持与其调用者的契约,无论异常如何,那么异常就可以并且可能应该处理。

如果调用者感到困惑,发现他们说“做x”,并且“y”部分的内部问题是“x”,因为“x”没有真正完成,那么你应该暴露异常(或其他一些以MyException为原因的异常。)

并且 - 考虑调用者是否可以合理地处理异常,或者是否有任何理由继续该程序,如果答案为否,请考虑使用RuntimeExceptionError,分别

无论如何,这就是我要说的。

答案 1 :(得分:1)

答案很简单:

如果你可以处理内部异常,你应该抓住它并做一些合理的事情

如果你可以处理它,你有两个选择:

  1. 如果异常是特定于实现的,请抓住它并抛出调用者可接受的异常(通常包含实际异常)
  2. 如果异常位于您的来电者的域中,请声明为抛出它并让您的来电与之交易
  3. 以下是每种类型的一些示例:

    示例1:处理它:

    public void deleteFile(String filename) {
        File file = new File(filename);
        try {
            file.delete();
        } catch (FileNotFoundException e) {
            // No big deal - it was already deleted
        }
    }
    

    示例2:包装它:

    public void changePassword(String username, String password) throws UserUpdateException {
        try {
            // execute SQL to update the password
            // but storing the user in a DB is an imlementation choice
            // we could use a file on disk or a remote web service to store user info
        } catch (SQLException e) {
            throw new UserUpdateException(e);
        }
    }
    

    示例3:什么都不做:

    public void insertIntoDatabase(Record record) throws SQLException {
        // execute SQL on the database
        // using a DB is implied - let the exception bubble up
    }