Как поймать пользовательское исключение

У меня есть следующий код в методе "main":

static void Main(string[] args)
{
    try
    {
         int a = 0;
         int b = 5;
         b /= a;
    }
    catch (MyException ex)
    {
         Console.WriteLine(ex.Message)
    }
}

И класс MyException выглядит следующим образом:

public class MyException : Exception
{
    public MyException()
    {

    }
}

Программа разбивается на b /= a; в то время как я ожидаю, что это пойдет в catch команда. Если я заменю MyException с Exception, исключение поймано, и программа не ломается.

Как я могу поймать пользовательское исключение?

5 ответов

Решение

Как уже упоминалось в комментариях, проблема не в том, что вы не можете поймать свое исключение, а в том, что код не генерирует исключение такого типа. Это бросает System.DivideByZeroException, Если вы хотите проверить свой код, чтобы увидеть, что он перехватывает ваше исключение, просто замените b /= a; с throw new MyException(); и вы увидите, что он поймает ваше исключение. Ловит что-то, когда вы используете базовый класс Exception поскольку DivicdeByZeroException также наследует от Exception,

Имейте в виду, что единственным исключением, которое когда-либо будет выдвинуто, является наличие линии throw new MyException(); где-то. Вы можете сделать все пользовательские исключения, которые хотите, но библиотеки.NET не собираются просто создавать их для вас. В этом случае вам даже не следует использовать пользовательское исключение, если это учебное упражнение, которое хорошо, но оно не имеет смысла, когда у вас уже есть информационное исключение.

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

static void Main(string[] args)
{
    try
    {
         Foo();
    }
    catch (MyException ex)
    {
         Console.WriteLine(ex.Message)
    }
}

static void Foo()
{
    throw new MyException()
}

Как указывает Random832, линия b /= a бросает System.DivideByZeroException, DivideByZeroException не равно MyException,

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

То, что делает обработка исключений, по существу пересекает иерархию. Для DivByZero нет обработчика, может быть, для его родителя, потом для его родителя и так далее. Родителем всех исключений является Exception, поэтому ваш код в конце концов перехватывает. Почему он не перехватывает MyException, потому что нет ссылки от DivByZero на MyException. MyException находится в отдельной ветке.

Это как раз наоборот: если вы определите

public class MyException : DivideByZeroException
{
    public MyException() { }
}

и использовать

static void Main(string[] args)
{
    try
    {
         throw new MyException();
    }
    catch (DivideByZeroException ex)
    {
         Console.WriteLine("Exception caught");
    }
}

тогда твой улов сработает. catch ловит указанное вами исключение и его потомков.

Другие вопросы по тегам