【问题标题】:How to avoid repetition within custom java exception classes如何避免自定义 java 异常类中的重复
【发布时间】:2015-07-15 16:55:11
【问题描述】:

我喜欢创建 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 模式的重复;对于解决异常类重复这一特定问题的工具有什么建议吗?

【问题讨论】:

  • 这对我来说很好。
  • @SotiriosDelimanolis 我相信 OP 试图说明的一点是,如果他有 10 个自定义异常类,他必须在所有这些异常类中重复此代码。
  • @CKing 不,我明白了。这对我来说很好。
  • @SotiriosDelimanolis 是的。对我也很好。但是别人不好,所以值得深思。从一个异常类到另一个异常类的唯一变化是类的名称。这是一个非常好的问题 IMO。
  • 你总是可以省略你不使用的构造函数。

标签: java exception inheritance dry


【解决方案1】:

如果您创建“业务”异常,则不应只复制 Exception 中的所有构造函数。相反,创建使用您的业务对象的异常。例如,如果由您的业务对象 Request 建模的请求失败,您可以使用单个构造函数创建 RequestFailedException:

public RequestFailedException(Request request) {
    super("Request to " + request.getUrl() + " failed.";
}

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

【讨论】:

  • 我同意对于某些Exceptions,封装相关信息是个好主意,但并非所有Exceptions 都有这个要求;大多数Exceptions 不只是自定义命名的包装器吗?我只是觉得烦人的是,对于那种Exceptions,所有这些重复的代码都被创建了。
  • 我认为我们(Java 开发人员)倾向于经常抛出异常。例如,尝试提供方法来预先检查某些条件,而不是实现一个方法,如果不满足条件,则会引发异常。此外,如果出现问题,请尝试保持弹性并返回一些可能不完美但对调用者仍然有用的内容。
  • 虽然我完全同意这个答案所说的,但这不是 OP 所要求的。
  • @FedericoPeraltaSchaffner 如果他遵循我的建议,他会避免重复。
  • 争论代码中异常的使用频率和替代方案是straw man 对简洁地定义Exception 类的实际问题;无论用法如何,子类化异常在 Java 中都很常见。我的问题是这些子类在适当定义的情况下如何简洁地完成。
猜你喜欢
  • 2017-04-18
  • 1970-01-01
  • 2012-11-25
  • 2014-12-16
  • 2014-03-29
  • 2019-02-28
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多