Трассировка стека Java в разных локалях - PullRequest
1 голос
/ 01 февраля 2010

Я пытаюсь выполнить автоматический анализ исключений java и стековых трасс, отправляемых на наш центральный сервер (написано на c #). У меня сейчас работает алгоритм, который анализирует стековые трассировки в стандартном представлении и в процессе пытается определить локаль, сгенерировавшую исключение, но протестировав ее только на английском языке, и хотел бы проверить и другие локали.

Более конкретно, каждая строка в трассировке стека выглядит примерно так:

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

, где 'at', похоже, зависит от локали, а остальное довольно общее для форматирования. Я ищу простой способ получить эти разделительные слова, специфичные для локали, которые не требуют переключения региональных настроек на все возможные языки, которые я могу придумать.

Я не java wiz, поэтому мне было интересно, смогу ли я найти / скачать некоторые ресурсы, которые задают слова-разделители из разных локалей, или есть ли другие очевидные подходы, чтобы сделать мою жизнь проще (по крайней мере, для этой небольшой задачи)

ОБНОВЛЕНИЕ: Просто чтобы прояснить ситуацию, у меня нет реальной проблемы в разборе строки, чтобы получить имя метода / имя класса и имя файла / номер белья, если они доступны. То, что я ищу, - это список начальных слов, где «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, полученные со всего мира, всегда будут отформатированы на английском языке. Это правильное предположение?

1 Ответ

3 голосов
/ 01 февраля 2010

Насколько мне известно, префикс "at" никогда не переводится.

Это вряд ли изменится, но точный формат трассировки стека не указан:

Формат этой информации зависит от реализации

Если у вас есть какой-либо контроль над тем, как трассировка стека маршалируется из 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());
}
...