Я пытаюсь выполнить автоматический анализ исключений 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, полученные со всего мира, всегда будут отформатированы на английском языке. Это правильное предположение?