在进取的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"
。还应该可以链接这些注释,或列出多个要转换的例外。
我的猜测是注释会引入一个包装函数,其中包含可以调用原始函数的捕获代码块。然后,注释只有编译时间延长(而不是运行时间延长)。
我并不主张明智地做到这一点,这可能不是因为这些注释会改变程序语义。这可能是一个学术问题,只需要学习" ...
答案 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)可能不知道它并认为代码无效。