是否需要捕获我在 throws 子句中指定的异常?

Is there a need to catch exceptions that I've speciffied in throws clause?

是否需要捕获我在 throws 子句中指定的异常?反之亦然,是否需要指定捕获的异常?

public method() throws IOException, SQLException {
     ...
     try {
          ....
     }catch(IOException | SQLException ex) {
          ex.getMessage();
     }
}

没有明确需要捕获签名中指定的异常。

理想情况下,答案取决于,如果您想将异常传播给调用者,则不要捕获异常。让调用者知道异常并决定接下来要做什么,比如显示消息、恢复操作、清理等。最好不要捕获异常

您可能处于需要捕获任何异常以用于日志记录或实际业务逻辑的情况:如果 操作失败,则使用 操作作为备份。

在你的例子中,你正在吞下异常,因为似乎没有对 ex.getMessage() 返回的内容进行任何处理,这是不推荐的。

  • 您可以声明一个方法 throws Exception 如果您想要 调用方法捕获异常。
  • 如果您希望相同的方法处理异常,那么您必须捕获它。
  • 您应该捕获异常或将方法声明为 throws

简短的回答是"no"。如果您在代码中捕获了异常,那么您将不会抛出它们(如前一条评论所述),因此无需在 throws 子句中声明它们。相反,如果你想把它们扔给你的来电者,你不应该抓住它们。唯一的例外是您可能出于某种原因想要捕获异常并将其记录在此处,然后重新抛出它以便在堆栈的更上层进行处理。

您的方法不需要声明它会抛出这些异常,因为您在方法中捕获了它们。 throws 应该在可以从方法中抛出异常并且必须在调用树上进一步处理时使用。

在此示例中,MyCheckedException 是一个异常,它可能会从您的方法中抛出,并且必须由调用方法处理,方法是让该方法捕获异常或声明它抛出异常。

public method() throws MyCheckedException {
    ...
    try {
        ....
    } catch(IOException | SQLException ex) {
        ex.getMessage();
    }
}

如果异常是或扩展了 RuntimeException,则不需要声明它已抛出(但这里存在更深层次的设计问题)。

异常有两种类型:

选中和未选中。

This page 说:

Checked: are the exceptions that are checked at compile time

Unchecked are the exceptions that are not checked at compiled time

            +-----------+
          | Throwable |
            +-----------+
             /         \
          /           \
      +-------+          +-----------+
      | Error |          | Exception |
      +-------+          +-----------+
    /  |  \            /     |    \
      \______/            \______/     \
                                   +------------------+
    unchecked       checked        | RuntimeException |
                                   +------------------+
                                    /   |    |      \
                                    \________________/

                                        unchecked

所以这是一条通用规则,如果可以合理地预期客户端可以从异常中恢复,则将其设为已检查异常。如果客户端无法从异常中恢复,则将其设为未经检查的异常

还有on this site,上面写着:

Exception Handling is mainly used to handle the checked exceptions. If there occurs any unchecked exception such as NullPointerException, it is programmers fault that he is not performing check up before the code being used.

catch exception 的概念是指示某些事情 wrong.To 用户和开发人员。 捕获异常并记录错误总是很好的。越详细越好,更容易修复代码。 但是如果你像 sqlException 这样的特定异常你可以跳过另一种可以抛出的异常。