在Eclipse中更改自动生成的未处理异常捕获代码?

29

如果在Java中出现未处理的异常,Eclipse会为我提供两个选项:(1)添加throws声明和(2)使用try/catch包围。

如果我选择(2),它会添加代码

try {
   myfunction();
} catch (MyUnhandledException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

我希望您能将此更改为

try {
   myfunction();
} catch (MyUnhandledException e) {
    throw new RuntimeException(e);
}

这种情况可能吗?

更新

为什么总有人喜欢改变话题?

如果捕获并打印了异常,则不需要再次捕获它。如果我因疏忽忘记处理异常,我希望我的应用程序崩溃。因此,默认情况下我会重新抛出异常。


如果你想这样做的话,就选择选项(1)。 - Gilbert Le Blanc
注意:请仔细阅读问题。明确的目标是选择选项2,但要有一个默认的catch块,以防程序员忘记处理异常。这是合理的。该做法甚至让我自己也在考虑。 - Andy Thomas
老话题了..但你最好更新默认的catch块,将其更改为无法编译的内容,这将“强制”你在编译时记得处理异常。 - crig
你应该问:“我想在Eclipse中更改默认生成的catch块”。如果没有人理解你的问题,请考虑重新表述。感谢你的建议 :) - lud
4个回答

37

是的,您可以更改Eclipse添加的默认代码。

  1. 在首选项中导航至Java>代码样式>代码模板
  2. 代码下,选择Catch块体
  3. 按编辑按钮以更改代码。完成后,按确定按钮。

考虑在默认catch块中添加TODO注释。例如,默认情况下包括:

     // ${todo} Auto-generated catch block

1

就我个人而言,无论实际的检查异常类型是什么,我都使用通用语法。你可以让Eclipse将其作为模板来使用:

try {
 ...
} 
catch (RuntimeException e) { throw e; } 
catch (Exception e) { throw new RuntimeException(e); }

重点是将整个代码块包装起来,而不是单独包装每行可能引发异常的代码。该代码块可能抛出任意数量的已检查和未检查的异常,这样可以让未经处理的未检查异常通过,并将已检查异常包装起来。

0

如果您从catch子句中重新抛出异常,那么您必须在调用当前方法的方法中处理异常。但是,如果您将异常包装在RuntimeException中,则不需要处理它。但是,为什么要这样做呢?

我的意思是,为什么不直接:-

try {
   myfunction();
} catch (MyUnhandledException e) {
    throw e;
}

因为在你的代码中,基本上是将一个可能是受检异常包装在一个未受检异常中。如果我假设你的MyUnhandledException受检异常

还要注意,如果您采用这种方法,仍然需要在throws子句声明它需要抛出

如果您只想按照自己的方式做,那么也可以正常工作。 您可以根据@Andy的答案更改Eclipse设置

但是,最好看看您的设计。为什么覆盖的方法会抛出在您的overridden方法中未声明的异常。可能有些问题,应该进行纠正。


如果我能够抛出 MyUnhandledException,那么它就不是一个错误了。从问题中可以看出,MyUnhandledException 不是运行时异常,也没有在方法声明中描述——这是唯一一种会导致编译器错误的异常情况。因此,我需要在运行时包装器中重新抛出异常,而不是更改声明。如果方法被覆盖,可能需要这样做。 - Suzan Cioc
@SuzanCioc。好的,那样做是可行的。在这方面没有问题。但最好还是看一下你要重写的方法。如果被重写的方法没有声明抛出异常,而重写的方法却抛出了异常,那么肯定有问题。 - Rohit Jain
在C#中根本没有已检查的异常,也不会出现任何问题。因此,任何异常都可以被简单地包装成“RuntimeException”,除了异常本身之外,它不会引起任何额外的麻烦。 - Suzan Cioc
@SuzanCioc。C#是从哪里来的?你的问题标记为Java - Rohit Jain
@RohitJain Susan正在提供一个例子,说明一种没有检查异常的语言是多么幸运。我羡慕C#用户。 - Marko Topolnik
@MarkoTopolnik.. 哦。我也是:( 我对C#一无所知。 - Rohit Jain

-1

你可能已经意识到了...但是如果你想要摆脱所有烦人的杂乱和检查异常的困扰,为什么不在每个方法中添加throws Exception呢?

对于重写接口方法,可以使用这种模式:

@Override
public void close() throws IOException {
    try {
        _close();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        throw new RuntimeException(e);
    }
}

private void _close() throws Exception {
    // ... closing ops
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接