在toString实现中捕获通用异常-错误的做法?

gen*_*per 8 java exception tostring

我有一个域模型类,该类具有toString实现,如下所示:

public String toString() {
     try {
        return getX() + "\n"
             getY() + "\n"
             getZ(); //etc.
     } catch(Exception e) {
        throw new RuntimeException(e);
     }
}
Run Code Online (Sandbox Code Playgroud)

的方法getX()getY()getZ()不是简单的吸气剂,它们可以在后台预定义的键-值对的静态地图执行查找,通常查找。他们throws SomeCheckedException中有些人签名。

我的印象是,这是不好的做法,并且有“代码异味”。toString()甚至需要进行此检查的事实对我来说都是不良设计的征兆。但我的一位同事,究竟是错捕的一般要求ExceptiontoString(),因为抓住了Exception进一步传播。

我认为它至少违反了KISS原则,因为这样的简单方法toString()表示需要特殊的异常处理。

那么在toString()中包含一个包罗万象的块是否有代码味道?

我发现的答案是针对捕获通用的一般情况,Exception而我大多数人都同意,如果您正在执行通用错误处理机制或批处理,那么它有望适用于通用异常。这个论点在我们的讨论中没有说服力,所以我很好奇其他观点。

小智 4

对于toString()方法来说,捕捉 Exception并不一定是不好的做法。然而,重新抛出它是有问题的部分。

toString()的约定是:

...一般来说,toString 方法返回一个“以文本方式表示”该对象的字符串。结果应该是一个简洁但信息丰富的表示形式,易于人们阅读......

在《Effective Java》第 3 版(第 12 条)中,Bloch 进一步坚持认为:

在实际应用中,toString 方法应该返回对象中包含的所有有趣信息。

因此,如果这需要调用可能抛出已检查异常的方法,那就这样吧,捕获这些异常很有意义。

但是:引发的检查异常提供有关对象状态的信息。与 的目标一致toString,在 . 返回的消息中包含异常条件可能是一个好主意toString

至于为什么从 抛出异常是一个坏主意toString这篇文章提供了一个很好的答案。

建议:使用特定异常类型捕获已检查的异常,并将此事实集成到消息中toString(),而不是传播它。