如何在自定义Java异常类中避免重复

7
我喜欢创建名称指示应用程序特定问题的Exception类。
通常,为了定义它们,会定义一个新的class,其超类是某些Exception类型。
由于父Exception类中存在多个公共构造函数,因此子类通常看起来像这样:
package com.example.exception;

/**
 * MyException is thrown when some application-level expectation is not met.
 */
public class MyException extends Exception {

    public MyException() {
        super();
    }

    public MyException(String message) {
        super(message);
    }

    public MyException(Throwable cause) {
        super(cause);
    }

    public MyException(String message, Throwable cause) {
        super(message, cause);
    }

}

DRY的角度来看,我发现这种方法很繁琐,特别是在定义Exception层次结构时。
我熟悉像Lombok这样的工具,可以帮助减少常见Java模式的重复; 有没有建议的工具可以解决这个特定问题的例外类的重复?

2
这对我来说看起来不错。 - Sotirios Delimanolis
2
@CKing 不,我明白了。对我来说那样也可以。 - Sotirios Delimanolis
3
可以,我也没意见。但是有人不同意,这值得考虑一下。从一个异常类到另一个异常类唯一的区别就是类名。在我看来,这是一个非常好的问题。 - Chetan Kinger
3
你可以随时省略你没有使用的构造函数。 - Kevin Krumwiede
1
@KevinKrumwiede,这是一个很好的观点,但未来的开发人员仍然需要在需要时定义它们;我想要避免一开始就出现重复。 - Kaushik Shankar
显示剩余2条评论
1个回答

4
如果您创建“业务”异常,不应只从 Exception 复制所有构造函数。相反,创建使用您的业务对象的异常。例如,如果由您的业务对象 Request 建模的请求失败,则可以创建一个具有单个构造函数的 RequestFailedException
public RequestFailedException(Request request) {
    super("Request to " + request.getUrl() + " failed.";
}

你甚至可以将Request对象的引用存储到一个字段中,并提供一个getter方法,以便处理异常的方法可以获得有关正在发生什么事情的更多信息。


1
我同意对于某些Exception,封装相关信息是一个好主意,但并不是所有的Exception都有这个要求;大多数Exception只是自定义命名的包装器吗?我只是觉得对于那些类型的Exception,创建所有这些重复代码很烦人。 - Kaushik Shankar
1
我认为我们(Java开发人员)经常过度使用异常。例如,尝试提供事先检查某些条件的方法,而不是实现一个在条件不满足时抛出异常的方法。此外,如果出现问题,请尝试具有弹性并返回可能不完美但对调用者仍然有用的内容。 - hzpz
1
虽然我完全同意这个答案所说的,但它并不是OP所问的。 - fps
@FedericoPeraltaSchaffner 如果他听从我的建议,他将避免重复。 - hzpz
2
关于在代码中使用异常的频率和替代方案进行争论是一个“草人”(Straw man),这并不是定义“异常”类简洁的实际问题;无论使用情况如何,在Java中子类化异常是很常见的。我的问题是关于如何简洁地定义这些子类。 - Kaushik Shankar
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - hzpz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接