【问题标题】:"Using try-catch and throws both for exception handling", is it a good approach?“同时使用 try-catch 和 throws 进行异常处理”,这是一个好方法吗?
【发布时间】:2018-07-18 01:30:25
【问题描述】:

“使用 try-catch 和 throws 来处理异常”,这是一个好方法吗?使用这种方法有哪些适用的优点/缺点?

请看下面的示例代码 sn-p,我有一个 try-catch 块以及 throws 子句。 在下面的代码 sn-p 中,我尝试在 catchExceptionMethod() 中读取一个文件,该文件引发 FileNotFoundException 并在 catch 块中捕获它。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;

public class ExceptionTest {


    public static void main(String[] args) {

        ExceptionTest obj=new ExceptionTest();

        try {
            obj.catchExceptionMethod("test.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

    public void catchExceptionMethod(String path) throws FileNotFoundException{
        try {
            BufferedReader br=new BufferedReader(new FileReader(new File(path)));
        }  catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

【问题讨论】:

  • 如果异常永远不会被抛出或重新抛出,则不需要 throws 子句。
  • 如果你已经用 catch 块处理了方法内部的异常并且不重新抛出它,它怎么会从方法本身抛出呢?简短的回答:这是不好的和多余的。您的catchExceptionMethod 永远不会抛出FileNotFoundException 并添加throws FileNotFoundException 只是一个直截了当的谎言;)。
  • 感谢 OHGODSPIDERS 和 MenoHochschild 的回复

标签: java exception exception-handling try-catch throws


【解决方案1】:

正如其他人在他们的 cmets 中已经指出的那样,捕获异常(而不重新抛出它)并在 throws 子句中声明它是无稽之谈,因为异常永远不会离开您的方法。

大多数时候,捕获异常是不好的。如果你的方法不能完成它的工作,抛出一个异常,所以你的调用方法知道这一步失败并且可以中止它自己的计算(你通常只对异常不做任何事情,除了在 @ 987654322@子句的相关方法)。

仅当您知道如何有效地继续时才捕获异常,即使知道前面的某个步骤失败了 - 通常情况下,您不能,因此仅使用 try-catch 围绕顶级操作,将异常记录到某些记录文件并经常通知用户是您能做的最好的事情。


有人提出问题,在这种情况下什么是顶级操作?通常,它是一段代码,用于完成来自程序外部的某些任务。

所以这取决于应用程序的类型。如果它是一个控制台应用程序,它通常是 main() 方法。对于桌面应用程序,顶层可能是菜单和按钮操作。如果它是某种服务器,它可能是实现来自客户端的某些请求的代码,等等。

通常,您可以在此处说:“嗯,[例如打开文件操作] 失败,但它的成功对于执行下一件事 [可能是创建一个新文件,按照选择由用户]。”

不要夹在构成您的问题解决算法的一些动作链的中间。如果某个先决条件步骤失败,那么链条的其余部分很可能会产生废话。

【讨论】:

  • 这引出了一个问题:什么是“顶级”?
猜你喜欢
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 2014-08-23
  • 2012-05-04
  • 2011-01-29
  • 2011-04-01
相关资源
最近更新 更多