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