不同语言环境中的 Java 堆栈跟踪

标签 java localization stack-trace

我正在尝试对发送到我们的中央服务器(用 C# 编写)的 Java 异常和堆栈跟踪进行一些自动解析。我现在有一个算法可以将堆栈跟踪解析为标准表示,并在此过程中尝试确定生成异常的语言环境,但只测试了英语,并且也想验证其他语言环境。

更具体地说,堆栈跟踪中的每一行的格式大致如下:

    ...
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    ...

其中“at”似乎是特定于语言环境的,其余的对于格式化来说是非常通用的。我正在寻找一种简单的方法来获取这些特定于区域设置的分隔符,而不需要我将区域设置切换为我能想到的所有可能的语言。

我不是 Java 专家,所以我想知道我是否可以找到/下载一些资源来指定来自不同语言环境的分隔词,或者是否有其他明显的方法可以让我的生活更轻松(至少对于这个小任务) ?

更新:明确地说,我在解析行以获取方法名/类名和文件名/行号(如果它们可用)时没有真正的问题。我正在寻找的是起始单词列表,其中“at”是英语单词(如上所示)。我在想这些字符串可能出现在某个“语言包”或某个资源文件中,但不是 Java 人我真的不知道去哪里找。

另一项更新: 尝试了以下代码,它似乎表明“at”字对于所有语言环境都是相同的(如果 Locale.setLocale 方法是正确的调用)

    public static void main(String[] args) {
    Locale[] locs = Locale.getAvailableLocales();
    for(Locale l:locs)
    {
        System.out.println(l.getDisplayName());
        Locale.setDefault(l);
        GetAndPrintException();
    }       

}

private static void GetAndPrintException() {
    try
    {
        throw new RuntimeException("BOOM!");
    }
    catch(RuntimeException exc)
    {
          StringWriter stringWrite = new StringWriter();
            PrintWriter printWrite = new PrintWriter(stringWrite);
            exc.printStackTrace(printWrite);
            printWrite.flush();
            printWrite.close();

            System.out.println(stringWrite.toString());
    }
}

此代码为列表中的所有语言环境打印出相同的堆栈跟踪,没有针对跟踪的语言环境特定更改。如果这是正确的并且符合预期,那么我似乎可以假设从世界各地收到的 java 堆栈跟踪将始终以英语格式化。这是一个正确的假设吗?

最佳答案

据我所知,“at”前缀从未被翻译过。

它不太可能变化,但确切的 format of the stack trace未指定:

The format of this information depends on the implementation

如果您对如何从 JVM 编码堆栈跟踪有任何控制,您可以创建一个不那么模糊的形式:

java.lang.Throwable e = ...
StackTraceElement[] trace = e.getStackTrace();
for (StackTraceElement element : trace) {
  System.out.println(element.getClassName());
  System.out.println(element.getMethodName());
  System.out.println(element.getFileName());
  System.out.println(element.getLineNumber());
}

关于不同语言环境中的 Java 堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2175593/

相关文章:

Java:将一个ImageIcon设置为等于另一个

ios - 我应该如何在 iOS 项目中存储本地化字符串?

android - Android 本地化的工作原理

c# - 附加 .net 调试器,同时仍然提供有用的死亡日志记录

java - 使用 CSS/Java 显示图像而不是按钮框架

java - 如何在 Apache Spark 中将时区设置为 UTC?

java - 用于匹配特殊模式的正则表达式

Java 星期几,每个语言环境有 2 个字母

exception - 打印堆栈跟踪

c++ - 共享库中的回溯函数