我想知道在java(纯代码,而不是Eclipse的东西)中是否有一种方法可以"语法糖"增加重复的try-catch代码。也就是说,我必须包装的一堆函数
public void foo(){
try{
// bla
} catch (Exception e) {
System.out.println("caught exception:");
e.printStackTrace();
}
}
public void bar(){
try{
// other bla
} catch (Exception e) {
System.out.println("caught exception:");
e.printStackTrace();
}
}
等等。我想写
@excepted public void foo(){
// bla
}
@excepted public void bar(){
// other bla
}
我认为这种糖在蟒蛇身上是可能的。这在Java中可能吗?
您不能像伪代码所建议的那样使用注释,但您可以使方法抛出:
public void bar() throws Exception {}
让它一直冒出来,在任何你想捕捉的地方捕捉它,在调用树的更高位置(或者在调用堆栈的下面,如果你愿意的话)。
将try/catch封装在接受接口的类/方法中。将匿名实现传递给该类/方法。只有当涉及到异常处理时才真正好,否则也会有类似的噪音。
您也可以玩AOP/字节码游戏,这取决于实际的用例。
对于问题的第一部分,在Java7中,有新的语法糖可以用来捕获重复异常,请参阅本文。
关于你问题的第二部分,恐怕Java中没有这样的东西。
我的建议是要么用throws Exception
声明方法,要么catch并将它们重新抛出为RuntimeExceptions
。
在实践中,仅仅捕获并打印Exceptions
是个坏主意,因为尽管您没有从Exception
中恢复任何操作,但仍在继续执行。即使你的代码继续运行良好,很快你就会有一个充满数百个异常的日志文件,它对于调试和在中查找有用信息来说几乎毫无价值
try {
...
} catch (Exception e) {
System.out.println("caught exception:");
e.printStackTrace();
}
为了这个答案,我假设
- 您得到了一个类Base,其中包含一大堆抛出Exceptions的非最终方法
- 您应该准备一个扩展Base的类Extends,但会更改某些方法的行为以记录异常,而不是抛出异常
- 您可以访问Base的源代码,并可以进行修改
你可以写一个注释处理器。在基类上放一个注释,告诉处理器生成Extension类。然后在一些方法上,添加一个注释,告诉处理器记录异常,而不是抛出异常。
根据您的情况,这可能比节省的工作量更多(编写和调试处理器)。
您还可以通过编写InvocationHandler并使用Proxy来实现所需的结果。
从JDK 7开始,我们就有了一个名为try-with-resources
的语法糖,所以如果您正在使用资源,或者您可以将您的资源打包到一个类似于类的资源中,将AutoCloseable
实现为
public class MyResource implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("Closed MyResource");
}
}
那么你就可以摆脱这种负担了。
顺便说一句,如果你像@sarumont提到的那样尝试,只是让异常冒泡,你可能会丢失原始异常(catch中的异常会从try块中隐藏原始异常),这是非常不推荐的,因为你使用异常进行故障排除,而错误的异常只会令人困惑。