Java异常消息是否有约定?

时间:2016-10-25 04:44:06

标签: java gradle coding-style

我一直在尝试抛出带有更多信息的异常。我做了多行,因为我想让它变得冗长并帮助调试。

throw new RuntimeException("Something failed.\n" + 
    "Please provide another dependency on this class\n\n" + 
    "  MyClass object = new MyClass(depdencyA, dependencyB)");

但是我应该这样做吗?似乎许多例外都是单行,但我觉得它不够冗长。

仅供参考,我正在编写Gradle插件,所以如果有不同的约定,请告诉我。

如果有,请向我显示Oracle等权威人士的参考或文件。

2 个答案:

答案 0 :(得分:1)

异常(和异常消息)应尽可能具体和简洁。

他们应该提供足够的信息来查明问题,并告知用户(或管理员)如何解决问题。

你的例子在这些方面失败了:

  1. RuntimeException非常通用 - 选择更具体的异常类型(可能是某些现有的异常类型,可能是您创建的某种异常类型)
  2. “有些事情失败了。”是不必要的 - 如果一切正常,你就不会抛出异常
  3. “请提供对此类的另一个依赖” - 如果您的类需要特定数量的依赖项,请告诉用户:“仅提供5个依赖项中的2个”。或者告诉用户缺少什么依赖项:“找不到数据源”
  4. “MyClass object = new MyClass(depdencyA,dependencyB)” - 这部分假定用户端有一些调用样式。如果使用反射或通过方法引用调用构造函数/方法怎么办?
  5. 引发异常的确切位置也包含在堆栈跟踪中 - 请勿在异常消息中再次包含此信息

答案 1 :(得分:0)

没有一般惯例。但是:

  1. 像这样投掷RuntimeException通常是一个坏主意。

  2. 如果针对普通用户,详细的异常消息可能会非常容易。

  3. 无法保证合理处理嵌入在异常消息中的标记(如换行符,制表符等)。 (首先,您无法预测将显示消息的窗口的字符宽度,以及(甚至)是否将使用固定宽度的字体。)

  4. 国际化....

  5. 对于Gradle案例,您可以(应该)检查其他插件的作用,还可以看看Gradle如何处理多行异常消息。

    另一种处理为诊断提供额外细节的方法是使用应用程序的记录器记录INFO或DEBUG事件,其中包含之前引发异常的详细信息。< / p>