java - 如何通过 Java 注解抛出异常?

标签 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;
}

...或任何其他机制,将方法 header 中声明的一种已检查异常类型“强制转换”为。通常这个“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" 来代替。还应该可以链接这些注释,或列出多个异常以进行转换。

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

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

最佳答案

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

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

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

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

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

关于java - 如何通过 Java 注解抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11930218/

相关文章:

java - 如何将函数作为参数从java传递给kotlin方法?

java - 在 ActiveMQ 中使用带有虚拟主题的持久订阅者,订阅恢复策略是否发挥作用?

Delphi在异常后获取堆栈跟踪

exception - Glassfish 部署 CommandException 错误

java - 是否可以创建一个适用于 Java 中不同类的泛型方法?

java - 不同字符串模式的单个正则表达式

c# - 如何在 C# 中显示该方法成功返回或失败而不返回值?

c# - Ninject NamedScope 条件绑定(bind)

grails - 如何获取服务的spring bean实例,通过webflow中的依赖注入(inject)添加

java - 被测单元 : Impl or Interface?