Как поймать пользовательское исключение
У меня есть следующий код в методе "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
ловит указанное вами исключение и его потомков.