在java中尝试捕获语法糖

时间:2012-01-10 19:45:28

标签: java try-catch syntactic-sugar

我想知道在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?

6 个答案:

答案 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)

为了这个答案,我会假设

  1. 您将获得一个类Base,其中包含一组抛出异常的非最终方法。
  2. 你应该准备一个扩展Base的类扩展,但是改变某些方法的行为来记录异常而不是抛出它们。
  3. 您可以访问Base的源代码并进行修改。
  4. 您可以编写注释处理器。在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块中的原始异常隐藏了),这是不推荐的,因为您将异常用于故障排除,而错误的异常只会使您感到困惑。