Как создать собственное исключение C #? - PullRequest
22 голосов
/ 16 марта 2011

В настоящее время я изучаю C #, но я застрял на чем-то и не могу найти решение для этого.
Я пытаюсь создать свой собственный класс Exception.

Исключение называется «InvalidNumberException», оно проверяет, равно ли число 5. Я знаю, что это может показаться глупым, но мне просто нужно получить представление о создании пользовательских исключений.

До сих пор я обнаружил в MSDN, что для создания Исключения мне нужны эти четыре конструктора:

public class InvalidNumberException : System.Exception
{
    public InvalidNumbertException() : base() { }
    public InvalidNumberException(string message) : base(message) { }
    public InvalidNumberException(string message, System.Exception inner) : base(message, inner) { }

    // A constructor is needed for serialization when an
    // exception propagates from a remoting server to the client. 
    protected InvalidNumberException(System.Runtime.Serialization.SerializationInfo info,
        System.Runtime.Serialization.StreamingContext context) { }
}

, но я не знаю, как реализовать метод или конструктор в этом классе, чтобычисло, введенное с консоли, равно 5, и если это не так, оно выдает исключение.

Буду признателен, если кто-нибудь поможет мне в этом.

Ответы [ 5 ]

27 голосов
/ 16 марта 2011

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

if (number == 5)
    throw new InvalidNumberException();
23 голосов
/ 16 марта 2011

Вам не нужны все эти конструкторы. Подумайте об исключении, которое вы создаете - чтобы int было от != до 5.

Итак, у меня был бы один конструктор, подобный этому:

public InvalidNumberException(int value)
   : base(String.Format("Some custom error message. Value: {0}", value)) { }

И используйте это так:

if (number == 5)
   throw new InvalidNumberException(number);

Вы не должны заключать это в блок try. Это работа кода, который выполняет вышеуказанный блок кода для отслеживания исключений, например:

try
{
   CallSomeMethodWhichChecksTheNumberAndThrowsIfNecessary();
}
catch (InvalidNumberException inex)
{
   // do something, print to console, log, etc
}

Я надеюсь, что это просто для наклона, потому что для этого есть методы Int32.Parse и Int32.TryParse - пользовательский класс исключений не требуется.

8 голосов
/ 20 мая 2014

Принят неправильный ответ!

Из принятого ответа:

public InvalidNumberException(int value)
{
   var message = string.Format("Some custom error message. Value: {0}", value);
   base(message, this.InnerException)
}

Это лучший способ сделать это:

public InvalidNumberException(int value) : base(string.Format("Some custom error message. Value: {0}", value)) { }
4 голосов
/ 16 марта 2011

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

if (conditionMet)
    throw new Exception();

Чтобы быть более конкретным, вы можете использовать более конкретные исключения, такие как InvalidOperationException, NullReferenceException и т. Д. Иногда вам может понадобиться использовать еще более конкретное исключение, и именно при создании вашегоТип исключения, производный от базового System.Exception.Представьте, что пользовательское исключение, которое вы создаете, является контейнером для условия, в котором была ваша программа.В вашем случае условие состоит в том, что был передан неверный номер, поэтому вы создаете контейнер InvalidNumberException, который вы используете вместо общего исключения, описанного выше.

Всякий раз, когда CLR выполняет оператор «throw new», он прерываетвыполнение текущего пути кода и будет искать операторы catch, которые могут обработать это исключение.

Таким образом, ваш код может выглядеть следующим образом:

try
{
    if (number == 5)
        throw new InvalidNumberException();
}
catch (InvalidNumberException e)
{
   System.Console.WriteLine("Hey I got an InvalidNumberException");
}
1 голос
/ 17 июня 2016

Не обязательно верно, что все сгенерированные исключения относятся к ошибкам, которые приведут к прерыванию работы вашего приложения - до тех пор, пока они будут перехвачены без фильтрации, то есть;).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...