我正在尝试对java异常进行一些自动解析,并将堆栈跟踪发送到我们的中央服务器(用c#编写)。我现在有一个算法工作,它将堆栈跟踪解析为标准表示,并在此过程中尝试确定生成异常的语言环境,但仅在英语上测试,并且还想验证其他语言环境。
更具体地说,堆栈跟踪中的每一行似乎都大致如下格式:
...
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
...
其中'at'似乎是特定于语言环境的,其余的格式非常通用。我正在寻找一种简单的方法来获取这些特定于语言环境的分隔符,这些单词不需要我将区域设置切换到我能想到的所有可能的语言。
我不是java wiz,所以我想知道我是否可以找到/下载一些资源来指定来自不同语言环境的分隔符,或者是否还有其他明显的方法可以让我的生活变得更轻松(至少对于这个小任务而言) ?
更新:为了清楚起见,我在解析行以获取methodname / classname和文件名/ linenumber(如果它们可用)时没有任何问题。我要找的是起始单词列表,其中'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 stacktraces将始终用英语格式化。这是正确的假设吗?
答案 0 :(得分:3)
据我所知,“at”前缀从未翻译过。
不太可能发生变化,但未指定确切的format of the stack trace:
此信息的格式取决于实施
如果您可以控制如何从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());
}