Step 2 (S-47512)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/12772/step/2

Step 2 (S-47512) 1.png

[00:00 - 00:17] любой программе может случиться ошибка для этого есть 1000 и 1 причина может быть пользователь ввел неправильные данные может быть отвалилось необходимое программе базы данных или другой важной сетевой ресурс может быть э сбоит чип оперативной памяти


[00:17 - 00:33] не случайным образом портить данные в нем хранящиеся причины могут быть разные но непреложный факт состоит в том что от всех ошибок не застраховаться а следовательно нашим программам приходится иногда с ними сталкиваться и как то на них реагировать


[00:33 - 00:50] разных языках существует разная культура обработки ошибок определяемое как возможностями языка платформы так и исторически сложившимися традициями чтобы дальнейший рассказ не был слишком теоретическим давайте рассмотрим такой пример


[00:50 - 01:09] предположим вы пишете подключаем разные программы библиотеку вычисляющую математические выражения лицо этой библиотеки и интерфейсы калькулятор и как это его реализации интерфейса есть метод принимающий строку с выражением и возвращаешься обратно да


[01:09 - 01:28] вычисленное значение выражения и вот выражение подано на вход содержится ошибка например в нем встречается число где в качестве десятичного разделителя используется запятая вместо точки как калькулятору на это реагировать


[01:28 - 01:44] самый простой по реализации не самый плохой последствиям способ это вызов система ext то есть программы немедленно завершится упадет по сути потеряв все накопленные в памяти данные раз и все нету ни программы ни данных


[01:44 - 02:03] я между всю большую программу включающую калькуляторы в качестве 1 из своих компонентов недостатки такого поведения понятны программа рухнула пользователю придется перезапускать и начинать все что делал сначала хорошо еще если программа сообщает в чем причина ошибки


[02:03 - 02:20] а то как пользователь догадается что на самом деле программу палок тому что неделю назад он вел где то число неправильном формате в общем систем эксит это не самое дружелюбное поведение со стороны нашей библиотеке калькулятора есть способ немного получше


[02:20 - 02:39] в случае ошибки в выражении наша библиотека будет возвращать в качестве результата какое то специальное значение например нам по которому вызывающая сторона поймет что случилась ошибка но нужно чтобы возвращаемого типа было свободное значений которые можно зарезервировать под ошибку


[02:39 - 02:55] это не всегда возможно например генератор случайных чисел может сгенерировать абсолютно любое число где нам взять отдельное значение под ошибку если видов ошибок несколько их надо различать то потребуется несколько значений


[02:55 - 03:14] да и в нашем случае нам может совершенно законно получиться при некоторых вычислениях например при делении 0x0 или при умножении 0 до бесконечности в общем как обозначить ошибку непонятно а даже если бы мы выделили какое то специальное значение


[03:14 - 03:31] вызывающий код некрасиво и форме для своевременного отлова этой ошибки чтобы обойти проблему с резервированием значение под ошибку возвращаемым типом можно пойти дальше и у метода завести выходной параметр специально пошла к ошибки


[03:31 - 03:49] или возвращать из методы не double а простенькие объект пару состоящую из числа результата и признака ошибки примерно так


[03:49 - 04:06] тогда весь диапазон типа результата


[04:06 - 04:21] будет использоваться по своему назначению правда ив и для отслеживания ошибки вызывающем коде никуда не денутся есть еще вариант заведением от признак ошибки отдельного поля или методов самом классе


[04:21 - 04:40] то есть после вызова метода колки late вызывающий код должен будет дернуть еще 1 метод калькулятора чтобы узнать а можно ли верить возвращенному только что результатов очевидно это еще более усложняет вызывающий код а также ставит крест на использовании 1 экземпляра калькулятора из нескольких


[04:40 - 04:41] потоков