Задача курса
Go errors.Is и fmt.Errorf с %w: оборачивание ошибок
Курс «Golang с нуля» · урок «Тип error: возврат, проверка и оборачивание»
Условие
Рабочий диапазон глубины
Водолазные операции требуют строгого контроля рабочих глубин: слишком мелко — и погружение теряет смысл или становится опасным из-за волнения, слишком глубоко — и давление выходит за пределы безопасного диапазона. Поэтому любая система, принимающая значение глубины от оператора, обязана немедленно распознать нарушение границ и сообщить о нём точно, без размытых формулировок.
Пользователь хочет передать конкретное числовое значение глубины и получить однозначный ответ: лежит ли оно в допустимом диапазоне от пяти до тридцати метров включительно. Если значение выходит за нижнюю границу, это один вид отказа; если за верхнюю — другой. Различие принципиально, потому что реакция оператора в каждом случае своя.
Чтобы цепочка ошибок не терялась при передаче вверх по стеку, внешняя проверка оборачивает исходную причину, добавляя собственный контекст, но сохраняя возможность докопаться до первопричины стандартными средствами сравнения ошибок. Итоговый вывод программы должен чётко различать оба типа нарушения и демонстрировать, что обёртывание не скрыло исходную информацию.
Что уже дано
В шаблоне объявлены две сигнальные ошибки: ErrTooShallow и ErrTooDeep.
Что нужно сделать
Допишите validateDepth и checkDivePlan. Рабочий диапазон глубины — от 5 до 30 метров включительно. Верните ErrTooShallow ниже диапазона и ErrTooDeep выше него. checkDivePlan добавляет контекст план погружения, сохраняя причину для errors.Is. В main уже выводятся разные причины для двух сигнальных ошибок.
Ввод и вывод
Программа читает одно целое число из stdin. Для допустимой глубины она печатает глубина принята: N м; иначе печатает ошибку с контекстом и строку причины.
Примеры
Пример 1
- Ввод
18
- Ожидаемый результат
глубина принята: 18 м
