4

在进取的 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;
}

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

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

使用代码应如下所示:

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

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

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

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

4

2 回答 2

3

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

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

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

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

并且由于你标记了这个问题dependency-injection,假设你使用 Spring,这里是 Spring 自己的异常翻译机制

于 2012-08-13T08:04:39.570 回答
0

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

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

于 2012-08-13T08:06:25.440 回答