Где я должен создать объект Exception? - PullRequest
5 голосов
/ 11 марта 2020

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

Допустим, у меня есть следующий код в классе UserData:

private MailAddress _addr;

public UserData(string emailAddress)
{
    // Tries to validate the e-mail address
    try
    {
        _addr = new MailAddress(emailAddress);
    }
    catch
    {
        throw new ArgumentException(nameof(emailAddress), "Invalid email address.");
    }
    if (_addr.Address != emailAddress)
    {
        throw new ArgumentException(nameof(emailAddress), "Invalid email address.");
    }
}

Вы можете видеть что в обоих операторах throw я выкидываю одно и то же исключение.

Вопрос: правильно ли добавить метод построителя исключений, чтобы получить мое исключение и выдать его? Получу ли я правильную трассировку стека и тому подобное, если я это сделаю? И если нет, то как определить между создателями исключений и конструкторами?

1 Ответ

3 голосов
/ 11 марта 2020

Правильно ли добавить метод построителя исключений, чтобы получить мое исключение и выдать

Это зависит. Как предложено в статье, на которую вы ссылались: Если это то же исключение (с той же информацией), имеет смысл создать такой вспомогательный метод, чтобы сохранить ваш код в чистоте.

Получу ли я правильную трассировку стека и такое, если я сделаю это

Да, вы будете. Посмотрите на этот пример. (DotNetFiddle) .

public static void Main() 
{
    try{
        throw CreateEx("Hi");
    } catch(Exception ex) {
        Console.WriteLine(ex.ToString());   
    }

    try {
        CreateEx2("Hi");
    } catch(Exception ex) {
        Console.WriteLine(ex.ToString()); 
    }  

}

public static Exception CreateEx(string text){
    text += " Additional text";

    return new ArgumentOutOfRangeException(text);
}

public static void CreateEx2(string text){
    text += " Additional text";

    throw new ArgumentOutOfRangeException(text);
}

Трассировка стека зависит от того, где находится исключение брошено , а не от того, где оно построено.

System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: Hi Additional text
   at Program.Main() in d:\Windows\Temp\b4ln3dbq.0.cs:line 13
System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: Hi Additional text
   at Program.CreateEx2(String text) in d:\Windows\Temp\b4ln3dbq.0.cs:line 34
   at Program.Main() in d:\Windows\Temp\b4ln3dbq.0.cs:line 19
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...