我想知道在java(纯代码,而不是一些Eclipse的东西)中是否有一种方法可以将“语法糖”重复尝试捕获代码。也就是说,我必须包装一堆函数
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
}
我认为这种类型的糖在python中是可能的。在Java中有可能吗?
你不能做像你的伪代码建议注释,但你可以使方法抛出:
public void bar() throws Exception {}
然后让它一直冒出来,在任何你想要的地方捕捉它,在呼叫树上方(或者如果你愿意的话,在呼叫堆栈中)。
在接受接口的类/方法中包装try / catch。将匿名实现传递给该类/方法。当涉及异常处理时真的很好,否则同样吵。
你也可以玩AOP /字节码游戏,具体取决于实际用例。
对于你的问题的第一部分,在Java 7中有新的语法糖用于捕获重复异常,请看一下这个article。
对于你的问题的第二部分,我担心Java中没有这样的东西。
我建议要么用throws Exception
声明你的方法,要么抓住并重新抛出它们作为RuntimeExceptions
。
只是捕捉和打印Exceptions
在实践中是一个坏主意,因为你继续执行尽管没有做任何事情从Exception
恢复。即使您的代码继续正常运行,很快您将拥有一个填充了数百个异常的日志文件,它将变得几乎毫无价值,无法进行调试和查找有用的信息。
try {
...
} catch (Exception e) {
System.out.println("caught exception:");
e.printStackTrace();
}
为了这个答案,我会假设
你可以写一个注释处理器。在Base类上添加一个注释,告诉处理器创建Extension类。然后在一些方法上,添加一个注释告诉处理器记录异常而不是丢弃它们。
根据您的具体情况,这可能比保存更多的工作(编写和调试处理器)。
您也可以通过编写InvocationHandler并使用Proxy来获得所需的结果。
现在我们从JDK 7开始就有一个名为try-with-resources
的语法糖,所以如果你正在使用资源,或者你可以把你的包装成类似资源的类来实现AutoCloseable
as
public class MyResource implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("Closed MyResource");
}
}
那么你就可以摆脱这种负担。
顺便说一句,如果您尝试@sarumont提到,只是让异常冒泡,您可能会丢失原始异常(catch中的异常将隐藏try块中的原始异常),这是不建议的,因为您使用异常故障排除,而错误的例外只会令人困惑。