如何通过Java注释转换异常?

时间:2012-08-13 07:59:26

标签: java exception dependency-injection annotations

在进取的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" -block必须进入这样一个类的每个方法。

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

使用代码应如下所示:

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

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

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

我并不主张明智地做到这一点,这可能不是因为这些注释会改变程序语义。这可能是一个学术问题,只需要学习" ...

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:0)

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

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