为什么我们在java中遵循从窄到宽的异常捕获机制?

时间:2014-09-11 06:33:10

标签: java

拿这段代码:

try
         {
             FileReader f=new FileReader("D:/sda.t");            
         }catch(FileNotFoundException e)
         {
             e.printStackTrace();
         }catch(Exception f)
         {
             f.printStackTrace();
         }
  1. 为什么我们采用这种方法?
  2. 为什么我们不只是使用异常异议来捕获所有异常而不是针对特定异常?

6 个答案:

答案 0 :(得分:1)

  

为什么我们采用这种方法?   为什么我们不仅仅使用异常异议来捕获所有异常而不是针对特定异常?

很简单,如果您想在发生特定异常时执行特定任务,请执行此操作。

答案 1 :(得分:1)

正如其他人所说,抓住所有Exception是一个坏主意,因为通常你想以不同方式处理它们。

虽然你还需要注意捕捉Exception也会捕获所有RuntimException,你通常会 想要抓住它们。其中包括NullPointerException

等内容

如果你没有抓住RuntimeException s,那么一旦程序到达一个程序就会死亡,如果你抓住Exception并忘记处理显示异常的任何内容,你会收到通知。然后你会错过RuntimeException s,它表示程序员错误。

答案 2 :(得分:0)

如果您对异常执行的唯一操作是printStackTrace(),那么就没有/只有一点。关键是不同的处理代码可以与不同的异常相关联,并且将抛出的异常与捕获列表匹配是按照指定的顺序完成的(使用第一个匹配的选择机制)。

答案 3 :(得分:0)

在java7或更新版本中,您可以使用multicatch语句:

  catch(SQLException | IOException e) {
    logger.log(e);
}

答案 4 :(得分:0)

因为如果您确实希望发生特定的异常,您将以不同的方式处理它。例如,您可能希望在获得FileNotFoundException时创建文件。

如果您按照您提供的示例进行广泛缩小,那么FileNotFoundException将永远不会被捕获,因为首先使用更宽的Exception。如此广泛的缩小是无用的。

答案 5 :(得分:0)

3个理由:

  1. 分隔错误处理代码。
  2. 能够传播错误报告方法的调用堆栈。
  3. 分组和区分错误类型。
  4. 查看docsthis answer