1

我有x一个方法,它调用y它里面的另一个方法,它调用了一个抛出异常的方法MyException。此时我有两个选择,要么宣传我的方法x,但有例外MyException......比如

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

(因为用这样y的条款做广告throws......)

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

或者将调用包装y在我的方法x中的 try catch 块中并处理它?像这样..

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

什么是拇指规则?

4

2 回答 2

1

答案很简单:

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

如果你不能处理它,你有两个选择:

  1. 如果异常是特定于实现的,则捕获它并抛出调用者可以接受的异常(通常包装实际异常)
  2. 如果异常在你的调用者的域中,声明为抛出它并让你的调用者处理它

以下是每种类型的一些示例:

示例 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
}
于 2012-05-16T05:27:52.343 回答
1

如果您的方法可以与其调用者保持合同,而不管异常如何,那么异常就是它可以并且可能应该处理的事情。

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

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

反正我就是这么说的。

于 2012-05-16T05:00:18.490 回答