Сообщения об исключениях на английском языке?

287
задан BartoszKP 14 January 2016 в 06:34
поделиться

4 ответа

Эта проблема может частично работаться вокруг. Код исключения Платформы загружает сообщения об ошибках из своих ресурсов, на основе локали текущего потока. В случае некоторых исключений это происходит в то время, когда к Свойству сообщения получают доступ.

Для тех исключений, можно получить полную американскую английскую версию сообщения путем краткого переключения локали потока на en-США при входе его (сохранение исходной пользовательской локали заранее и восстановление его сразу впоследствии).

Выполнение этого на отдельном потоке еще лучше: это гарантирует, что не будет никаких побочных эффектов. Например:

try
{
  System.IO.StreamReader sr=new System.IO.StreamReader(@"c:\does-not-exist");
}
catch(Exception ex)
{
  Console.WriteLine(ex.ToString()); //Will display localized message
  ExceptionLogger el = new ExceptionLogger(ex);
  System.Threading.Thread t = new System.Threading.Thread(el.DoLog);
  t.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
  t.Start();
}

, Где класс ExceptionLogger смотрит что-то как:

class ExceptionLogger
{
  Exception _ex;

  public ExceptionLogger(Exception ex)
  {
    _ex = ex;
  }

  public void DoLog()
  {
    Console.WriteLine(_ex.ToString()); //Will display en-US message
  }
}

Однако как Joe правильно указывает в комментарии к более раннему пересмотру этого ответа, некоторые сообщения уже (частично) загружаются из ресурсов языка в то время, когда исключение выдается.

Это относится к 'параметру, не может быть пустая' часть сообщения, сгенерированного, когда ArgumentNullException ("нечто") исключение брошен, например. В тех случаях сообщение будет все еще казаться (частично) локализованным, даже когда с помощью вышеупомянутого кода.

Кроме при помощи непрактичных взломов, таких как выполнение всего Вашего кода неUI потока с локалью en-США для начала, там, кажется, не очень, можно сделать об этом: код исключения Платформы.NET не имеет никаких средств для переопределения локали сообщения об ошибке.

66
ответ дан Community 23 November 2019 в 01:48
поделиться

Я вообразил бы один из этих подходов:

1) исключения только когда-либо читаются Вами, т.е. они не клиентская функция, таким образом, можно использовать соединенный проводами не локализованные строки, которые не изменятся, когда Вы будете работать в турецком режиме.

2) Включают код ошибки, например, 0X00000001 с каждой ошибкой так, чтобы можно было легко посмотреть он в в английской таблице.

2
ответ дан morechilli 23 November 2019 в 01:48
поделиться
CultureInfo oldCI = Thread.CurrentThread.CurrentCulture;

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture ("en-US");
Thread.CurrentThread.CurrentUICulture=new CultureInfo("en-US");
try
{
  System.IO.StreamReader sr=new System.IO.StreamReader(@"c:\does-not-exist");
}
catch(Exception ex)
{
  Console.WriteLine(ex.ToString())
}
Thread.CurrentThread.CurrentCulture = oldCI;
Thread.CurrentThread.CurrentUICulture = oldCI;

Без ОБХОДНЫХ РЕШЕНИЙ.

Спасибо:)

3
ответ дан 23 November 2019 в 01:48
поделиться

Вы должны регистрировать стек вызовов, а не просто сообщение об ошибке (IIRC, простое исключение. ToString () должен сделать это за вас). Отсюда вы можете точно определить, откуда возникло исключение, и, как правило, определить, какое это исключение.

-1
ответ дан 23 November 2019 в 01:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: