【问题标题】:Is it a bad idea to store data in a custom checked exception?将数据存储在自定义检查异常中是一个坏主意吗?
【发布时间】:2017-10-19 15:28:55
【问题描述】:

我有一个用例,我想在抛出异常时返回一些数据(一个对象)。我正在考虑将数据存储在我的自定义检查异常类中,并在异常在堆栈中的较高位置捕获时通过 getter 访问它。这被认为是一个坏主意吗?如果是这样,有什么更好的选择?我已经看到向自定义异常发送相关消息,但还没有真正看到它被用作数据存储。

我确实偶然发现了Return a value AND throw an exception?,其中一个答案是在做类似的事情。我更多地考虑重载构造函数并提供对象而不是将其作为另一个参数传递。这被认为是不好的编码习惯吗?

  public class NameException extends Exception
{

    private static final long serialVersionUID = -4983060448714460116L;
    private Service externalService;


    public NameException(final String message)
    {
        super(message);
    }

    public NameException()
    {
    }

    public NameException(Service externalService)
    {
        this.externalService =externalService;
    }

    public Service getExternalService()
    {
      return externalService;
    }
}

【问题讨论】:

  • 我认为这不是一个坏主意,它是根据你的需要。

标签: java exception exception-handling


【解决方案1】:

这是一个既定的模式。

例如,Spring 的 RestTemplate 的 HTTP 请求方法可能会抛出一个 RestClientResponseException,它具有类似 byte[] getResponseBodyAsByteArray() 的方法, String getResponseBodyAsString(), HttpHeaders getResponseHeaders(),String getStatusText() 等等。

【讨论】:

  • 作为后续,对传递给自定义异常的参数添加空检查是否有意义?您提到的 API 似乎没有这样做,只是说明哪些字段可以为空。
  • 在哪里添加空检查?填充任何可能不为空的字段是抛出代码的责任。如果您信任该代码,则无需添加代码进行检查。取决于你想要的防御程度。
  • Null 检查传递给构造函数的形式参数,因此在我的帖子中的示例中为externalService
  • 这是一个广泛的问题。请参阅此答案stackoverflow.com/a/2999417/7512(以及同一问题的其他答案——但我不确定发帖者是否选择了正确的答案)。我从不检查 null 参数 - 它可以向下游抛出 NullPointerException,并为调用者正确服务。
猜你喜欢
  • 2011-04-20
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多