【问题标题】:How to cast an exception via Java annotation?如何通过Java注解抛出异常?
【发布时间】:2012-08-13 07:59:25
【问题描述】:

在进取的 Java 程序中经常看到以下模式

public Something myMethod() throws MyException {
    try {
        // may throw checked DbException:
        Connection c = openDataBase("connectionstring");
        // ... other code throwing more checked exceptions ...
    } catch(DbException e) {
        throw new MyException(e);
    }
    return something;
}

...或任何其他机制将方法标头中声明的not 一种已检查异常类型“转换”为一种。很多时候,这个“try-catch-cast”块必须进入此类的每个方法中。

我想知道,如何实现一个注释,捕获并转换异常

使用代码应如下所示:

@ConvertException(MyException, DbException)
public Something myMethod() throws MyException {
    // may throw checked DbException:
    Connection c = openDataBase("connectionstring");
    // ...
    return something;
}

当然,也许必须改写MyException.class"MyException"。还应该可以链接这些注释,或者列出多个要转换的异常。

我的猜测是注释会引入一个包装函数,其中包含调用原始函数的捕获代码块。然后注释将只有编译时保留(而不是运行时保留)。

我不主张这样做是明智的,这可能不是因为这些注释改变了程序语义。 “只是学习”很可能是一个学术问题......

【问题讨论】:

    标签: java exception dependency-injection annotations


    【解决方案1】:

    注解本身根本不做任何事情。您需要一个工具来评估它们并根据它们进行一些代码更改。

    在您的情况下,AspectJ 似乎是最佳匹配。

    我的建议是阅读AspectJ in Action (2nd ed) by Ramnivas Laddad

    Table of Content 可以看出,它包含一个关于异常软化的章节,这几乎正是你想要的。

    既然你标记了这个问题dependency-injection,假设你使用Spring,这里是Spring自己的Exception translation mechanism

    【讨论】:

    • 我只知道弹簧的能力,并认为它可能能够做到这一点。感谢那个确实有 50% 的指针,并且正好解决了我的问题。
    【解决方案2】:

    是的,这应该可以通过创建一个annotation processor 来实现,该annotation processor 使用编译器树api(javac.tree 包)在编译源代码时对其进行操作。

    问题当然是,现在无论何时编译代码,这个注解处理器都必须存在,许多处理源代码的工具(最突出的 IDE)可能不知道它并认为代码无效。

    【讨论】:

      猜你喜欢
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 2013-11-20
      相关资源
      最近更新 更多