在java中尝试捕获语法糖

问题描述 投票:7回答:6

我想知道在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中有可能吗?

java try-catch syntactic-sugar
6个回答
4
投票

你不能做像你的伪代码建议注释,但你可以使方法抛出:

public void bar() throws Exception {}

然后让它一直冒出来,在任何你想要的地方捕捉它,在呼叫树上方(或者如果你愿意的话,在呼叫堆栈中)。


2
投票

在接受接口的类/方法中包装try / catch。将匿名实现传递给该类/方法。当涉及异常处理时真的很好,否则同样吵。

你也可以玩AOP /字节码游戏,具体取决于实际用例。


1
投票

对于你的问题的第一部分,在Java 7中有新的语法糖用于捕获重复异常,请看一下这个article

对于你的问题的第二部分,我担心Java中没有这样的东西。


1
投票

我建议要么用throws Exception声明你的方法,要么抓住并重新抛出它们作为RuntimeExceptions

只是捕捉和打印Exceptions在实践中是一个坏主意,因为你继续执行尽管没有做任何事情从Exception恢复。即使您的代码继续正常运行,很快您将拥有一个填充了数百个异常的日志文件,它将变得几乎毫无价值,无法进行调试和查找有用的信息。

try {
   ...
} catch (Exception e) {
   System.out.println("caught exception:");
   e.printStackTrace();
}

0
投票

为了这个答案,我会假设

  1. 你得到一个类Base,其中包含一大堆非异常方法,可以抛出异常。
  2. 你应该准备一个扩展Base的类,但是改变一些方法的行为以记录异常而不是抛出它们。
  3. 您可以访问Base的源代码并进行修改。

你可以写一个注释处理器。在Base类上添加一个注释,告诉处理器创建Extension类。然后在一些方法上,添加一个注释告诉处理器记录异常而不是丢弃它们。

根据您的具体情况,这可能比保存更多的工作(编写和调试处理器)。

您也可以通过编写InvocationHandler并使用Proxy来获得所需的结果。


0
投票

现在我们从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块中的原始异常),这是不建议的,因为您使用异常故障排除,而错误的例外只会令人困惑。

© www.soinside.com 2019 - 2024. All rights reserved.