【问题标题】:When should we throw exceptions, or catch exceptions, in a method?我们什么时候应该在方法中抛出异常或捕获异常?
【发布时间】:2015-10-14 23:48:32
【问题描述】:

我一直在阅读有关异常的更多信息,但我不确定在什么情况下我们应该抛出一个方法

public void fxml() throws IOException
{
     // method body here
}

或在方法中捕获异常

public void fxml()
{
          FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxml.fxml"));

            try
            {
                fxmlLoader.load();
            } 
            catch (IOException exception) 
            {
                throw new RuntimeException(exception);
            } 
}

从 Oracle 的例子来看

有时,代码可以捕获其中可能发生的异常。然而,在其他情况下,最好让调用堆栈更靠前的方法处理异常。例如,如果您将 ListOfNumbers 类作为类包的一部分提供,您可能无法预料到包中所有用户的需求。在这种情况下,最好不要捕获异常,并允许调用堆栈更靠前的方法来处理它。

https://docs.oracle.com/javase/tutorial/essential/exceptions/declaring.html

所以我很好奇这是不是说我们可能不需要类/方法,并且通过在这个方法中执行 try/catch 如果我们不使用它就没有任何目的,所以我们“抛出它”供以后使用?

似乎类本身也“抛出异常”以便以后使用......它只是一个抛出的层次结构,直到你最终可以使用它?在上面的教程中,后面几章是一个叫做“链式异常”的章节,这本质上是怎么回事,用于稍后使用的方法 throws?

我也读过这个帖子When to use throws in a Java method declaration?

但我发现它并没有完全解释我想知道的内容,但是我发现了这种兴趣

如果你正在捕获一个异常类型,你不需要抛出它,除非你打算重新抛出它。在您发布的示例中,开发人员应该做一个或另一个,而不是两者。

通常,如果您不打算对异常执行任何操作,则不应捕获它。

你能做的最危险的事情就是捕获一个异常而不用它做任何事情。

我不太确定他所说的“重新抛出”它是什么意思,除非他说的是抛出该方法并稍后再捕获它?

然后他说如果你不打算使用它,就不要做任何事情,所以如果我们需要它,似乎最好把它扔掉以备后用?

然后说它很危险?这是为什么呢?

所以本质上,如果我们不知道是否要使用它,那么我们应该抛出它以便可以调用方法本身,或者如果我们知道它将被调用,无论如何,那么我们应该做一个 try/catch 块?

我还注意到,我的示例还基于 IOException 引发了 RuntimeException。所以从某种意义上说,你可以采用我们抛出的第一个方法,不管有什么异常,然后把它扔到 try 或 catch 块中?似乎 catch 块更适合“RuntimeException”或其他系统异常之一,但也许还有其他用例?

想法?

感谢您的帮助!

【问题讨论】:

  • 很多都取决于调用者的期望。如果调用者依赖于方法调用的结果,那么抛出/重新抛出异常将是有利的,以便他们知道结果何时失效。这也将归结为该方法具有的控制量,例如,如果该方法加载配置文件,该方法是否具有影响程序其余部分的能力/控制,或者它是否与程序的其余部分?
  • 正如人们所料,这个问题,或者类似的问题,一直是asked many times on this site
  • 这与询问方法签名中是否有throws 部分不同。这样做会询问是否抛出 checked 异常。

标签: java exception exception-handling try-catch


【解决方案1】:

如果您的代码无法完成其工作(也称为“履行其合同”),您将引发异常。这可能是因为调用者向您传递了无效的输入,或者某些外部资源出现故障(例如丢失的网络连接)。

当您可以通过某种方式处理预期的下游问题时,捕获异常。例如,您可能会捕获表示网络问题的异常并重试该操作几次,或者您可能会向用户显示错误消息并询问下一步该做什么。

如果下游代码可能会引发异常,但您的代码处于中间位置并且不知道该怎么做,则只需让异常传递到调用代码即可。

【讨论】:

    猜你喜欢
    • 2020-03-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多