【问题标题】:Can you change the Type of Java Exception's error message?您可以更改 Java 异常类型的错误消息吗?
【发布时间】:2022-01-12 01:26:51
【问题描述】:

我正在编写一个运行时间非常慢的面向内部的工具。由于这个运行时,我试图验证输入是否有错误,并在实际运行该工具之前向客户端发送一个 JSON 对象,其中包含每个丢失或失败元素的详细列表。

我想知道是否有办法修改 java Exception 的错误消息返回类型,以便我可以在错误中抛出这个 HashMap。

包含错误的 hashmap 如下所示:

Error: {
   Message: "Your X is configured improperly, please fill out the required fields before running this tool", 
   formXErrors: {
     Message: "The following fields are missing from formX", 
     Error: {
       field1Name: "field 1", 
       field2Name: "field 2",
       ... 
    },
    formYErrors: {
     Message: "The following fields are missing from formY", 
     Error: {
       field1Name: "field 1", 
       field2Name: "field 2",
       ... 
     }
  } 
}

然后如果发现错误,我想像这样抛出它(将 HashMap 传递到消息字段而不是字符串):

if (errorHashMap != null) {
  throw new ToolXException(errorHashMap);
}

Java 对我来说有点新,所以我想知道是否有人可以指出我找到实现这种行为的方法。甚至可能吗?或者是返回这个HashMap而不是抛出的唯一方法,并将其发送给客户端?

提前致谢!

【问题讨论】:

    标签: java exception interface


    【解决方案1】:

    您无法编辑消息的类型,但您当然可以将您喜欢的任何类型的字段添加到自定义Exception 类型。

    class ToolXException extends Exception {
      private final Map<Key, Value> map;
      public Map<Key, Value> getMap() { return map; }
      public ToolXException(Map<Key, Value> map) {
        this.map = map;
      }
    } 
    

    ...然后你可以把它拿出来并在你抓住它时显示它:

    try {
      ...
    } catch (ToolXException e) {
      doSomethingWith(e.getMap());
    }
    

    【讨论】:

    • 这太完美了!非常感谢!
    • 如果对您有帮助,请单击此答案旁边的复选框以将其标记为已接受。
    【解决方案2】:

    这是绝对可能的。他们这样做的方法是创建可抛出子类之一的子类:ExceptionRuntimeExceptionError。您需要考虑的另一件事是您是否要将自定义异常链接到捕获的异常,或者它是否应该独立于“根本原因”

    【讨论】:

    • 你应该扩展Error。那是致命的系统错误。如果你想声明一个方法抛出ToolXException,那么扩展Exception。如果您希望异常“未经检查”,即不是抛出它的方法的类型签名的一部分,请使用RuntimeException。我会选择Exception
    • @tgdavies ...“不应扩展错误”。是的,但相当迂腐。您必须原谅“不纯”,因为没有看到太多区别。
    猜你喜欢
    • 1970-01-01
    • 2016-12-29
    • 2014-04-05
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    相关资源
    最近更新 更多