Создание пользовательских исключений с локализованными сообщениями об исключениях
Из этой статьи вы узнаете, как создавать определяемые пользователем исключения, унаследованные от базового Exception класса с локализованными сообщениями об исключениях с помощью вспомогательных сборок.
Создание пользовательских исключений
.NET содержит множество различных исключений, которые можно использовать. Однако в случаях, когда ни одна из них не соответствует вашим потребностям, вы можете создать собственное пользовательское исключение.
Предположим, что нужно создать StudentNotFoundException
, содержащее свойство StudentName
.
Чтобы создать пользовательское исключение, сделайте следующее:
Создайте класс, который наследует от Exception. Имя класса должно заканчиваться на Exception:
public class StudentNotFoundException : Exception { }
Public Class StudentNotFoundException Inherits Exception End Class
Добавьте конструкторы по умолчанию:
public class StudentNotFoundException : Exception { public StudentNotFoundException() { } public StudentNotFoundException(string message) : base(message) { } public StudentNotFoundException(string message, Exception inner) : base(message, inner) { } }
Public Class StudentNotFoundException Inherits Exception Public Sub New() End Sub Public Sub New(message As String) MyBase.New(message) End Sub Public Sub New(message As String, inner As Exception) MyBase.New(message, inner) End Sub End Class
Определите любые дополнительные свойства и конструкторы:
public class StudentNotFoundException : Exception { public string StudentName { get; } public StudentNotFoundException() { } public StudentNotFoundException(string message) : base(message) { } public StudentNotFoundException(string message, Exception inner) : base(message, inner) { } public StudentNotFoundException(string message, string studentName) : this(message) { StudentName = studentName; } }
Public Class StudentNotFoundException Inherits Exception Public ReadOnly Property StudentName As String Public Sub New() End Sub Public Sub New(message As String) MyBase.New(message) End Sub Public Sub New(message As String, inner As Exception) MyBase.New(message, inner) End Sub Public Sub New(message As String, studentName As String) Me.New(message) StudentName = studentName End Sub End Class
Создание локализованных сообщений об исключениях
Вы создали пользовательское исключение и можете вызывать его где угодно с помощью кода, подобного следующему:
throw new StudentNotFoundException("The student cannot be found.", "John");
Throw New StudentNotFoundException("The student cannot be found.", "John")
Проблема с предыдущей строкой заключается в том, что "The student cannot be found."
— это просто константная строка. В локализованном приложении вам необходимо иметь разные сообщения в зависимости от языка и региональных параметров пользователя.
Вспомогательные сборки — это хороший способ сделать это. Вспомогательные сборки — это библиотека DLL, содержащая ресурсы для определенного языка. При запросе конкретных ресурсов во время выполнения среда CLR находит этот ресурс в зависимости от языка и региональных параметров пользователя. Если вспомогательная сборка не найдена для этого языка и региональных параметров, используются ресурсы языка и региональных параметров по умолчанию.
Чтобы создать локализованные сообщения об исключениях:
Создайте папку с именем Ресурсы для хранения файлов ресурсов.
Добавьте в нее новый файл ресурсов. Для этого в Visual Studio щелкните правой кнопкой мыши папку в обозревателе решений и выберите Добавить>Новый элемент>Файл ресурсов. Присвойте файлу имя ExceptionMessages.resx. Это файл ресурсов по умолчанию.
Добавьте пару "имя/значение" для сообщения об исключении, как показано на следующем рисунке:
Добавьте новый файл ресурсов для французского языка. Присвойте ему имя ExceptionMessages.fr-FR.resx.
Снова добавьте пару "имя/значение" для сообщения об исключении, но со значением французского языка:
После сборки проекта папка выходных данных сборки должна содержать папку fr-FR с файлом DLL, который является вспомогательной сборкой.
Исключение вызывается с помощью кода, подобного приведенному ниже.
var resourceManager = new ResourceManager("FULLY_QUALIFIED_NAME_OF_RESOURCE_FILE", Assembly.GetExecutingAssembly()); throw new StudentNotFoundException(resourceManager.GetString("StudentNotFound"), "John");
Dim resourceManager As New ResourceManager("FULLY_QUALIFIED_NAME_OF_RESOURCE_FILE", Assembly.GetExecutingAssembly()) Throw New StudentNotFoundException(resourceManager.GetString("StudentNotFound"), "John")
Примечание.
Если имя проекта —
TestProject
, а файл ресурсов ExceptionMessages.resx находится в папке Ресурсы проекта, полное имя файла ресурсов —TestProject.Resources.ExceptionMessages
.