Как обрабатывать перевод сообщения об исключении?

Я не знаю, как лучше всего обрабатывать исключения в многоязычном приложении.

Где я должен обрабатывать перевод сообщения об ошибке (Exception.Message)?

Должен ли я перевести сообщение в ctor, как только я выброшу исключение?

throw new MyException("Error message", Resource.MyException_TranslatedMessage);

Или я могу исключить исключение, и я использую помощник домашнего помощника, который найдет сообщение об ошибке, используя тип исключения в логике представления?

try
{
    //...
}
catch(Exception ex)
{
    myLabel.Text = new ExceptionTranslator(ex).Translate();
}

Или Microsoft предлагает инструмент или механизм для этого?

Одним словом: каковы эффективные методы обработки сообщений сообщений об ошибках?

Ответ 1

Большинство исключений существует для технических целей, если только ваши операции и экипаж обслуживания не находятся в разных странах, эти исключения должны просто содержать сообщения на языке людей, которые пишут и поддерживают приложение.

В .NET Framework содержатся локализованные сообщения об исключениях. Для меня, как разработчика, это очень раздражает, поскольку сообщения об исключениях на моем локальном языке (голландский) не означают столько же, сколько и исходные английские сообщения об исключениях. Тем не менее, представляется разумным, чтобы Microsoft локализовала эти сообщения об исключениях в инфраструктуре, поскольку их целевую аудиторию можно найти где угодно.

Некоторые типы исключений, однако, явно отображаются для отображения пользователю. Это ваши ValidationException или BusinessLayerException. Их четкий контракт должен отображаться пользователю. Конечно, вы должны локализовать эти сообщения об исключениях, но вместо их перевода часто гораздо лучше и проще извлекать сообщение об исключении из локализованного ресурса при бросании исключения:

throw new ValidationException(Resources.InvalidUserName);

Ответ 2

Намного лучше только перевести его, когда он должен отображаться, ИМХО. Это относится к любой локализованной строке, а не только к сообщениям об ошибках.

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

Ответ 3

Внешний код не должен переводить сообщения

throw new MyException("Error message", Resource.MyException_TranslatedMessage);

Это лучшее решение в моей голове