2009-06-18 2 views
3

В моем локализуемого приложение, которое я бросить ArgumentException, как это:Локализация ArgumentException.Message в .NET

throw ArgumentException("LocalizedParamName", "LocalizedErrorMessage"); 

И я ловлю это так:

catch (Exception ex) 
{ 
    Display(ex.Message); 
} 

Я получаю в результате ошибки сообщение как:

LocalizedErrorMessage имя Параметр: LocalizedParamName

Проблема здесь: «Имя параметра:», которое написано на английском языке, а не на языке моего приложения. Я утверждаю, что строка находится на языке платформы .NET. Может ли кто-нибудь подтвердить это?

Один из способов это делает:

catch (ArgumentException ex) 
{ 
    Display((ex as Exception).Message + "\n" + "Translated(Parameter name:)"+ ex.ParamName); 
} 
catch (Exception ex) 
{ 
    Display(ex.Message); 
} 

Есть ли другие более элегантный способ?

+0

Erm, не уверен ваш вопрос или, может быть, я неправильно понимаю, но вы не должны локализовать свойство ParamName ArgumentException - неужели у вас нет разных версий одной и той же базы кода на нескольких языках? – RichardOD

ответ

3

Сообщение в исключениях должно быть для разработчиков, а не для конечных пользователей. Вы всегда должны пытаться поймать свои исключения таким образом, чтобы вы могли отображать осмысленное сообщение об ошибке. (Нет, «Программа столкнулась с непредвиденной ошибкой и теперь выходит» не имеет смысла.) Причина, по которой вы не должны отображать сообщение об исключении для конечного пользователя, заключается в том, что пользователю не важно, что разработчик прошел неправильный аргумент из функции Foo() для функции Bar(), не говоря уже о том, как это было неправильно. Но когда вы займетесь исправлением ошибки, вам нужно это знать.

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

3

Вы вызываете конструктор ArgumentException (строковое сообщение, string paramName) с непустым paramName.

Когда вы это сделаете, вы получите результат, который вы видите, это ваше сообщение, за которым следует «Имя параметра: ваше имяParamName».

Текст «Имя параметра:» исходит из ресурсов .NET Framework: причина, по которой вы не получаете локализованную версию, заключается в том, что вы, вероятно, не установили на своем компьютере соответствующие языковые пакеты .NET Framework. Вы можете скачать языковые пакеты here.

Если вы установили языковые пакеты для языка (ов), который вы используете, вы получите ожидаемый результат.

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

+0

Хороший ответ - я должен поставить языковой пакет на свой ответ. – RichardOD

Смежные вопросы