Возврат настраиваемого исключения

20

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

class CustomException : Exception
{
    public CustomException()
        : base() { }

    public CustomException(string message)
        : base(message) { }

    public CustomException(string format, params object[] args)
        : base(string.Format(format, args)) { }

    public CustomException(string message, Exception innerException)
        : base(message, innerException) { }

    public CustomException(string format, Exception innerException, params object[] args)
        : base(string.Format(format, args), innerException) { }
}

Затем я использую его

static void Main(string[] args)
{
    try
    {
        var zero = 0;
        var s = 2 / zero;
    }
    catch (CustomException ex)
    {
        Console.Write("Exception");
        Console.ReadKey();
    }
}

Я ожидаю, что получу свое исключение, но все, что я получаю, является стандартным исключением DivideByZeroException. Как я могу поймать деление на нулевое исключение, используя мой класс CustomException? Спасибо.

    
задан JohnyMotorhead 13.04.2013 в 23:12
источник
  • Почему .NET должен начать использовать ваше исключение? Вы должны бросить его самостоятельно. –  Tim Schmelter 13.04.2013 в 23:14
  • в порядке, даже если я добавлю новое выделение для исключения, я не получу его. Я по-прежнему получаю стандартное исключение. Нужно ли мне писать код в моем CustomException, чтобы поймать исключения DevideByZero? –  JohnyMotorhead 13.04.2013 в 23:19
  • Вы не должны, если вы бросаете перед div на ноль или используете подход Алексея. Кстати: я считаю, что не стоит заменять исключения, если у вас нет веских оснований. –  Linus Caldwell 13.04.2013 в 23:20

2 ответа

26

Волшебное изменение типа исключения, созданного существующим кодом, невозможно.

Вам нужно throw вашего исключения, чтобы уловить его:

try 
{
   try
    {
        var zero = 0;
        var s = 2 / zero;
    }
    catch (DivideByZeroException ex)
    { 
        // catch and convert exception
        throw new CustomException("Divide by Zero!!!!");
    }
}
catch (CustomException ex)
{
    Console.Write("Exception");
    Console.ReadKey();
}
    
ответ дан Alexei Levenkov 13.04.2013 в 23:14
источник
  • Возможно, вы захотите упомянуть, что это ужасная идея. –  Wilbert 06.12.2013 в 16:39
  • @Wilbert, какая часть? 2 / zero, вероятно, самый простой способ получить очень специфическое исключение (((string) (null)). Длина может выглядеть более явно «пример кода - не копировать»); повторное бросание другого исключения - довольно стандартная практика, когда некоторая операция высокого уровня терпит неудачу из-за одного из многих различных исключений (IOException, KeyNotFoundException и т. п. могут быть повторно выбраны как CustomerNotFoundException, возможно, с InnerException, установленным для этого исключения, или, возможно, не из-за требований безопасности ); надеюсь, ясно, что вложенный try / catch - всего лишь образец. –  Alexei Levenkov 06.12.2013 в 18:27
  • Да, с этим контекстом это имеет смысл, но просто образец кода .. ну :) –  Wilbert 09.12.2013 в 10:54
  • @AlexeiLevenkov, почему стандартное исключение не нужно бросать ключевое слово? –  AminM 16.06.2017 в 17:58
16

Прежде всего, если вы хотите увидеть свое собственное исключение, вы должны throw его где-то в вашем коде:

public static int DivideBy(this int x, int y)
{
    if (y == 0)
    {
        throw new CustomException("divide by zero");
    }

   return x/y; 

}

, то

int a = 5;
int b = 0;
try
{
      a.DivideBy(b);
}
catch(CustomException)
{
//....
}
    
ответ дан Dmitry Martovoi 13.04.2013 в 23:16
источник