Подтвердить что ты не робот

Как создать настраиваемое исключение С#?

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

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

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

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, а если это не так, оно генерирует исключение.

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Принятый ответ неверен!

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

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

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

if (conditionMet)
    throw new Exception();

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

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

Итак, ваш код может выглядеть так:

try
{
    if (number == 5)
        throw new InvalidNumberException();
}
catch (InvalidNumberException e)
{
   System.Console.WriteLine("Hey I got an InvalidNumberException");
}

Ответ 5

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

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