尝试在java中捕获语法糖



我想知道在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();
}

为了这个答案,我假设

  1. 您得到了一个类Base,其中包含一大堆抛出Exceptions的非最终方法
  2. 您应该准备一个扩展Base的类Extends,但会更改某些方法的行为以记录异常,而不是抛出异常
  3. 您可以访问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块中隐藏原始异常),这是非常不推荐的,因为你使用异常进行故障排除,而错误的异常只会令人困惑。

最新更新