我想知道在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?
答案 0 :(得分:4)
你不能用你的伪代码建议注释,但你可以抛出方法:
public void bar() throws Exception {}
让它一直冒出来,在任何你想要的地方捕捉它,在呼叫树的上方(或者如果你愿意的话,在呼叫堆栈中)。
答案 1 :(得分:2)
在接受接口的类/方法中包装try / catch。将匿名实现传递给该类/方法。当涉及异常处理时真的很好,否则同样吵。
根据实际使用情况,你也可以玩AOP /字节码游戏。
答案 2 :(得分:1)
对于你的问题的第一部分,在Java 7中有新的语法糖用于捕获重复异常,请看一下这个article。
对于你问题的第二部分,我担心Java中没有这样的东西。
答案 3 :(得分:1)
我建议您使用throws Exception
声明方法或捕获并将其重新抛出为RuntimeExceptions
。
只是抓住并打印Exceptions
是一个糟糕的想法,因为尽管没有从Exception
中恢复,但仍在继续执行。即使您的代码继续正常运行,很快您将拥有一个填充了数百个异常的日志文件,它将变得几乎毫无价值,无法进行调试和查找有用的信息。
try {
...
} catch (Exception e) {
System.out.println("caught exception:");
e.printStackTrace();
}
答案 4 :(得分:0)
为了这个答案,我会假设
您可以编写注释处理器。在Base类上添加一个注释,告诉处理器创建Extension类。然后在某些方法上,添加一个注释,告诉处理器记录异常而不是丢弃它们。
这可能比保存更多(编写和调试处理器),具体取决于您的具体情况。
您也可以通过撰写InvocationHandler并使用Proxy来获得所需的结果。
答案 5 :(得分:0)
现在,从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块中的原始异常隐藏了),这是不推荐的,因为您将异常用于故障排除,而错误的异常只会使您感到困惑。