# Конспект лекции "Исключения" ### // Конструкция try..catch..finally ## Авария завершения программы ``` int x = 5; int y = x / 0; Console.WriteLine($"Результат: {y}"); Console.WriteLine("Конец программы"); Console.Read(); ``` ``` Unhandled exception. System.DivideByZeroException: Attempted to divide by zero. at Program.
$(String[] args) in C:\Users\mister pig\RiderProjects\bamboo\bamboo\Program.cs:line 2 Process finished with exit code -1,073,741,676. ``` ## try...catch...finally ``` try { int x = 5; int y = x / 0; Console.WriteLine($"Результат: {y}"); } catch { Console.WriteLine("Возникло исключение!"); } finally { Console.WriteLine("Блок finally"); } Console.WriteLine("Конец программы"); Console.Read(); ``` ``` Возникло исключение! Блок finally Конец программы ``` ## блок try ``` try { int x = 5; int y = x / 0; Console.WriteLine($"Результат: {y}"); } catch { Console.WriteLine("Возникло исключение!"); } ``` ``` Возникло исключение! Process finished with exit code 0. ``` ## при наличии блока finally мы можем опустить блок catch ``` try { int x = 5; int y = x / 0; Console.WriteLine($"Результат: {y}"); } finally { Console.WriteLine("Блок finally"); } ``` ``` Unhandled exception. System.DivideByZeroException: Attempted to divide by zero. at Program.
$(String[] args) in C:\Users\mister pig\RiderProjects\bamboo\bamboo\Program.cs:line 4 Блок finally Process finished with exit code -1,073,741,676. ``` ### // Обработка исключений и условные конструкции ## программа предусматривает ввод числа и вывод его квадрата: ``` Console.WriteLine("Введите число"); int x = Int32.Parse(Console.ReadLine()); x *= x; Console.WriteLine("Квадрат числа: " + x); Console.Read(); ``` ``` Введите число 7 Квадрат числа: 49 ``` ## Если пользователь введет не число, а строку, какие-то другие символы, то программа выпадет в ошибку. ``` Console.WriteLine("Введите число"); int x; string input = Console.ReadLine(); if (Int32.TryParse(input, out x)) { x *= x; Console.WriteLine("Квадрат числа: " + x); } else { Console.WriteLine("Некорректный ввод"); } Console.Read(); ``` ``` Введите число что Некорректный ввод ``` ### // Блок catch и фильтры исключений #### // Определение блока catch ## обработаем только исключения типа DivideByZeroException: ``` try { int x = 5; int y = x / 0; Console.WriteLine($"Результат: {y}"); } catch(DivideByZeroException) { Console.WriteLine("Возникло исключение DivideByZeroException"); } ``` ``` Возникло исключение DivideByZeroException Process finished with exit code 0. ``` ## example ``` try { int x = 5; int y = x / 0; Console.WriteLine($"Результат: {y}"); } catch(DivideByZeroException ex) { Console.WriteLine($"Возникло исключение {ex.Message}"); } ``` ``` Возникло исключение Attempted to divide by zero. Process finished with exit code 0. ``` #### // Фильтры исключений ## условие when истинно ``` int x = 1; int y = 0; try { int result = x / y; } catch(DivideByZeroException) when (y==0 && x == 0) { Console.WriteLine("y не должен быть равен 0"); } catch(DivideByZeroException ex) { Console.WriteLine(ex.Message); } ``` ``` Attempted to divide by zero. Process finished with exit code 0. ``` ### // Типы исключений. Класс Exception ## обработаем исключения типа Exception: ``` try { int x = 5; int y = x / 0; Console.WriteLine($"Результат: {y}"); } catch (Exception ex) { Console.WriteLine($"Исключение: {ex.Message}"); Console.WriteLine($"Метод: {ex.TargetSite}"); Console.WriteLine($"Трассировка стека: {ex.StackTrace}"); } Console.Read(); ``` ``` Исключение: Attempted to divide by zero. Метод: Void
$(System.String[]) Трассировка стека: at Program.
$(String[] args) in C:\Users\mister pig\RiderProjects\bamboo\bamboo\Program.cs:line 4 ``` ## включаем дополнительные блоки catch: ``` try { int[] numbers = new int[4]; numbers[7] = 9; // IndexOutOfRangeException int x = 5; int y = x / 0; // DivideByZeroException Console.WriteLine($"Результат: {y}"); } catch (DivideByZeroException) { Console.WriteLine("Возникло исключение DivideByZeroException"); } catch (IndexOutOfRangeException ex) { Console.WriteLine(ex.Message); } Console.Read(); ``` ``` Index was outside the bounds of the array. ``` ## другая ситуация ``` try { object obj = "you"; int num = (int)obj; // InvalidCastException Console.WriteLine($"Результат: {num}"); } catch (DivideByZeroException) { Console.WriteLine("Возникло исключение DivideByZeroException"); } catch (IndexOutOfRangeException) { Console.WriteLine("Возникло исключение IndexOutOfRangeException"); } Console.Read(); ``` ``` Unhandled exception. System.InvalidCastException: Unable to cast object of type 'System.String' to type 'System.Int32'. at Program.
$(String[] args) in C:\Users\mister pig\RiderProjects\bamboo\bamboo\Program.cs:line 4 Process finished with exit code -532,462,766. ``` ## another example ``` try { object obj = "you"; int num = (int)obj; // InvalidCastException Console.WriteLine($"Результат: {num}"); } catch (DivideByZeroException) { Console.WriteLine("Возникло исключение DivideByZeroException"); } catch (IndexOutOfRangeException) { Console.WriteLine("Возникло исключение IndexOutOfRangeException"); } catch (Exception ex) { Console.WriteLine($"Исключение: {ex.Message}"); } Console.Read(); ``` ``` Исключение: Unable to cast object of type 'System.String' to type 'System.Int32'. ``` ### // Создание классов исключений ## ограничение по возрасту ``` try { Person p = new Person { Name = "Tom", Age = 17 }; } catch (Exception ex) { Console.WriteLine($"Ошибка: {ex.Message}"); } Console.Read(); class Person { private int age; public string Name { get; set; } public int Age { get { return age; } set { if (value < 18) { throw new Exception("Лицам до 18 регистрация запрещена"); } else { age = value; } } } } ``` ``` Ошибка: Лицам до 18 регистрация запрещена ``` ### // Поиск блока catch при обработке исключений ## example ``` try { TestClass.Method1(); } catch (DivideByZeroException ex) { Console.WriteLine($"Catch в Main : {ex.Message}"); } finally { Console.WriteLine("Блок finally в Main"); } Console.WriteLine("Конец метода Main"); Console.Read(); class TestClass { public static void Method1() { try { Method2(); } catch (IndexOutOfRangeException ex) { Console.WriteLine($"Catch в Method1 : {ex.Message}"); } finally { Console.WriteLine("Блок finally в Method1"); } Console.WriteLine("Конец метода Method1"); } static void Method2() { try { int x = 8; int y = x / 0; } finally { Console.WriteLine("Блок finally в Method2"); } Console.WriteLine("Конец метода Method2"); } } ``` ``` Блок finally в Method2 Блок finally в Method1 Catch в Main : Attempted to divide by zero. Блок finally в Main ``` ### // Генерация исключения и оператор throw ## ex ``` try { Console.Write("Введите строку: "); string message = Console.ReadLine(); if (message.Length > 6) { throw new Exception( "Длина строки больше 6 символов"); } } catch (Exception e) { Console.WriteLine($"Ошибка: {e.Message}"); } Console.Read(); ``` ``` Введите строку: какую строку Ошибка: Длина строки больше 6 символов ``` ## после данного оператора не указывается объект исключения ``` try { try { Console.Write("Введите строку: "); string message = Console.ReadLine(); if (message.Length > 6) { throw new Exception( "Длина строки больше 6 символов"); } } catch { Console.WriteLine("Возникло исключение"); throw; } } catch (Exception ex) { Console.WriteLine(ex.Message); } ``` ``` Введите строку: какую строку Возникло исключение Длина строки больше 6 символов Process finished with exit code 0. ``` ### // NULL ## example #### // Назначение и объявление ``` double? pi = 3.14; char? letter = 'a'; int m2 = 10; int? m = m2; bool? flag = null; // An array of a nullable value type: int?[] arr = new int?[10]; ``` ``` Process finished with exit code 0. ``` #### // Проверка экземпляра типа значения, допускающего значение NULL ``` int? a = 42; if (a is int valueOfA) { Console.WriteLine($"a is {valueOfA}"); } else { Console.WriteLine("a does not have a value"); } ``` ``` a is 42 ``` ## next example ``` int? b = 10; if (b.HasValue) { Console.WriteLine($"b is {b.Value}"); } else { Console.WriteLine("b does not have a value"); } ``` ``` b is 10 ``` ## next next example ``` int? c = 7; if (c != null) { Console.WriteLine($"c is {c.Value}"); } else { Console.WriteLine("c does not have a value"); } ``` ``` c is 7 ``` #### // Преобразование из типа значения, допускающего значение NULL, в базовый тип ``` int? a = 28; int b = a ?? -1; Console.WriteLine($"b is {b}"); // output: b is 28 int? c = null; int d = c ?? -1; Console.WriteLine($"d is {d}"); // output: d is -1 ``` ``` b is 28 d is -1 ``` #### // Операторы с нулификацией ``` int? a = 10; int? b = null; int? c = 10; a++; // a is 11 a = a * c; // a is 110 a = a + b; // a is null ``` ``` Process finished with exit code 0. ``` ## 10 не больше и не равно значению null, не меньше чем null ``` int? a = 10; Console.WriteLine($"{a} >= null is {a >= null}"); Console.WriteLine($"{a} < null is {a < null}"); Console.WriteLine($"{a} == null is {a == null}"); // Output: // 10 >= null is False // 10 < null is False // 10 == null is False int? b = null; int? c = null; Console.WriteLine($"null >= null is {b >= c}"); Console.WriteLine($"null == null is {b == c}"); // Output: // null >= null is False // null == null is True ``` ``` 10 >= null is False 10 < null is False 10 == null is False null >= null is False null == null is True Process finished with exit code 0. ``` #### // Упаковка-преобразование и распаковка-преобразование ``` int a = 41; object aBoxed = a; int? aNullable = (int?)aBoxed; Console.WriteLine($"Value of aNullable: {aNullable}"); object aNullableBoxed = aNullable; if (aNullableBoxed is int valueOfA) { Console.WriteLine($"aNullableBoxed is boxed int: {valueOfA}"); } // Output: // Value of aNullable: 41 // aNullableBoxed is boxed int: 41 ``` ``` Value of aNullable: 41 aNullableBoxed is boxed int: 41 Process finished with exit code 0. ``` #### // Оператор ?? ``` object x = null; object y = x ?? 100; // равно 100, так как x равен null object z = 200; object t = z ?? 44; // равно 200, так как z не равен null ``` ``` Process finished with exit code 0. ```