Поделиться через


Создание пользовательских исключений с локализованными сообщениями об исключениях

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

Создание пользовательских исключений

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

Предположим, что нужно создать StudentNotFoundException, содержащее свойство StudentName. Чтобы создать пользовательское исключение, сделайте следующее:

  1. Создайте класс, который наследует от Exception. Имя класса должно заканчиваться на Exception:

    public class StudentNotFoundException : Exception { }
    
    Public Class StudentNotFoundException
        Inherits Exception
    End Class
    
  2. Добавьте конструкторы по умолчанию:

    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
    
  3. Определите любые дополнительные свойства и конструкторы:

    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 находит этот ресурс в зависимости от языка и региональных параметров пользователя. Если вспомогательная сборка не найдена для этого языка и региональных параметров, используются ресурсы языка и региональных параметров по умолчанию.

Чтобы создать локализованные сообщения об исключениях:

  1. Создайте папку с именем Ресурсы для хранения файлов ресурсов.

  2. Добавьте в нее новый файл ресурсов. Для этого в Visual Studio щелкните правой кнопкой мыши папку в обозревателе решений и выберите Добавить>Новый элемент>Файл ресурсов. Присвойте файлу имя ExceptionMessages.resx. Это файл ресурсов по умолчанию.

  3. Добавьте пару "имя/значение" для сообщения об исключении, как показано на следующем рисунке:

    Добавление ресурсов в язык и региональные параметры по умолчанию

  4. Добавьте новый файл ресурсов для французского языка. Присвойте ему имя ExceptionMessages.fr-FR.resx.

  5. Снова добавьте пару "имя/значение" для сообщения об исключении, но со значением французского языка:

    Добавление ресурсов в язык и региональные параметры fr-FR

  6. После сборки проекта папка выходных данных сборки должна содержать папку fr-FR с файлом DLL, который является вспомогательной сборкой.

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

    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.

См. также