BadCats
@BadCats

Специфика SystemException?

всем привет, начал изучать исключения. Изучаю по видео курсу.
Имеется вот такой пример:
class Program
    {
        static void Main()
        {
            int a = 1, n = 2;

            try
            {
                // Попытка деления на ноль.
                a = a / (2 - n);

                Console.WriteLine("a = {0}", a);
            }
            catch (Exception e)
            {
                Console.WriteLine("Обработка исключения.");
                Console.WriteLine(e.Message);
            }

            // Delay.
            Console.ReadKey();
        }
    }

автор, через ObjectBrowser демонстрирует иерархию исключений в c#
1a1a82af064c44bd9570af5e933426a4.JPG
и говорит, что когда на строке a = a / (2 - n);
возникнет исключение типа DevideByZeroException , то при попадании в блок
catch (Exception e)
данный тип исключения приведется к базовому для всех исключений типу Exception (тут я все понял, ведь мы самми в качестве аргумента блока catch указали тип Exception)
затем автор говорит, что можно сделать и так
catch (DevideByZeroException e)

и так
catch ( ArithmeticException e)
У меня вопрос : допустим в данном случае мое исключение типа DevideByZeroException приведется в блоке catch к типу ArithmeticException, а в процессе компиляции все исключения все равно приводятся к типу Exception , или нет ?
Затем автор говорит, что в боке catch лучше не использовать тип исключения SystemException - т.к цитирую "Microsoft сами с первой версии языка подзапутались и тепер желеют, что вообще ввели тип исключчения SystemException " -прав ли автор ? почему (не надо писать это полная ересь - пожалуйста аргументируйте ответ ) - ? Может он что то имел ввиду, Отвечающие могут его перефразировать высказать свои догадкина счет того, что автор иммел ввиду.
  • Вопрос задан
  • 111 просмотров
Решения вопроса 2
@Flashmond
Студент, инженер-программист c#
По поводу первого вопроса. Нет, во время компиляции все исключения не приводятся к определенному типу. То есть бросается исключение DevideByZeroException, а потом последовательно в блоках catch ищется тот тип, к которому это исключение можно привести.
Например, вы можете выполнять разные действия при разных исключениях. Код, в котором ловится исключение типа Exception выполнится только в том случае, если сгенерированное исключение не может быть приведено к типам, описанным ранее
try
{
	//Code
}
catch ( DivideByZeroException ex )
{
}
catch ( ArithmeticException ex )
{
}
catch ( Exception ex )
{
}
Ответ написан
Комментировать
ArXen42
@ArXen42
Насколько я знаю, сначала MS пытались разграничить системные исключения и исключения приложения - введя базовые классы, емнип, называются SystemException и ApplicationException. Но в процессе разработки платформы все перемешалось и вместо структурированной иерархии получилось вот это, а выкинуть эти исключения они уже не могут из-за обратной совместимости.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Got_Oxidus
Учусь
Цепочка наследования
  1. Exception
  2. ArithmeticException
  3. DivideByZeroException


Компилятор может привести к типу, который выше. Т.Е. DivideByZeroException можно привести к ArithmeticException и Exception, a ArithmeticException можно только к Exception, а к DivideByZeroException нельзя.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы