我正在尝试对发送到我们的中央服务器(用 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/