【问题标题】:Java exception message lengthJava 异常消息长度
【发布时间】:2019-07-15 10:31:58
【问题描述】:

我正在设计一个数据库表,它将记录 Java 异常消息。

对于这种情况(也出于兴趣),我想知道我将遇到的(最大)消息大小。

目前我只对标准 java 语言异常感兴趣。

  • 邮件大小是否有任何技术限制?
  • 最常见异常的消息长度是多少?
  • 所有标准 java 异常的平均消息长度是多少?
  • 不同 Java 版本之间的消息是否有很大变化?

例子:

try {
  //Some code, which throws an Exception
} catch(Exception ex) {
  String msg = ex.toString();    //Use toString, because sometimes there is no message
  int size = msg.length();       //How large can this be?
}

可抛出的 toString() 实现:

  public String toString() {
    String var1 = this.getClass().getName();
    String var2 = this.getLocalizedMessage();
    return var2 != null ? var1 + ": " + var2 : var1;
  }

感谢您的回复。 额外问题:是否有一个包含所有 java 语言异常消息的列表(英文),所以我不必手动检查源文件?

【问题讨论】:

  • 我假设一些相对较短的长度(例如 4096 个字符)应该足以处理几乎所有 Exception 消息。如果可以,请在开发/测试环境中对其进行测试,如果需要更多,请返回并增加限制,然后再推送到产品。

标签: java database exception


【解决方案1】:

Exception.getMessage() 返回一个没有长度限制的String。没有“标准”消息长度之类的东西,它将取决于您在代码库中使用的任何库,例如javax.validation 的验证异常可能很长,而 NullPointerException 通常没有消息。

您应该从您的应用程序中获取几天的日志并编写一个正则表达式来测量异常的预期长度。有了这个值,您就可以做出有根据的猜测。

要么定义一个给定长度的VARCHAR 列并在异常消息过长时截断它,要么定义一个blob/clob 列并存储整个String。决定因素可能是您的数据库性能,例如Oracle allows VARCHAR to have only 4000 bytes.

【讨论】:

  • 感谢您的建议。也许其他人已经对此进行了一些研究。此外,有关 Java 核心人员如何选择异常消息/长度的一些信息也会很有趣。
  • 不要猜测工程任务,这是浪费时间。获取日志并衡量您对应用程序的预期。
【解决方案2】:

据我所知,消息长度没有限制,但在大多数情况下,消息都很短,以便实用。最大大小为 2000 个字符可能是安全的,但在 DB 中将其设置为 varchar,因此在每种情况下它只占用等于实际消息大小的空间。例外的方法toString() 也不会给你任何有意义的信息。如果没有消息,则将其存储为 null 或空字符串“”。

【讨论】:

  • 谢谢。我不同意“toString()”的评论。例如新的 BigDecimal("asdas");将抛出 NumberFormatException 但消息为空。所以 toString() 将返回“java.lang.NumberFormatException”,它比空字符串更有用。
  • HectorLector - 你可能有一点,但如果你想要更多信息,那么你可能想要存储堆栈跟踪,而不仅仅是一条错误消息。事实上,我在目前的工作中做了同样的项目,我们存储了堆栈跟踪。我编写了一个名为 MgntUtils 的开源库,它实际上有一个工具,可以将完整或非常巧妙地过滤的堆栈跟踪提取为字符串。如果您有兴趣,请参阅这篇文章:linkedin.com/pulse/… 并查看“Stacktrace 噪声过滤器”段落
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2014-04-05
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多