Книга: Выразительный JavaScript
Распространение ошибок
Распространение ошибок
К сожалению, программист может предотвратить появление не всех проблем. Если ваша программа общается с внешним миром, она может получить неправильные входные данные, или же системы, с которыми она пытается взаимодействовать, окажутся сломанными или недоступными.
Простые программы, или программы, работающие под вашим надзором, могут просто «сдаваться» в такой момент. Вы можете изучить проблему и попробовать снова. «Настоящие» приложения не должны просто «падать». Иногда приходится принимать неправильные входные данные и как-то с ними работать. В других случаях нужно сообщить пользователю, что что-то пошло не так, и потом уже сдаваться. В любом случае программа должна что-то сделать в ответ на возникновение проблемы.
Допустим, у вас есть функция promptInteger
, которая запрашивает целое число и возвращает его. Что она должна сделать, если пользователь введёт «апельсин»?
Один из вариантов – вернуть особое значение. Обычно для этих целей используют null
и undefined
.
function promptNumber(question) {
var result = Number(prompt(question, ""));
if (isNaN(result)) return null;
else return result;
}
console.log(promptNumber("Сколько пальцев видите?"));
Это надёжная стратегия. Теперь любой код, вызывающий promptNumber
, должен проверять, было ли возвращено число, и если нет, как-то выйти из ситуации – спросить снова, или задать значение по-умолчанию. Или вернуть специальное значение уже тому, кто его вызвал, сообщая о неудаче.
Во многих таких случаях, когда ошибки возникают часто и вызывающий функцию код должен принимать их во внимание, совершенно допустимо возвращать специальное значение как индикатор ошибки. Но есть и минусы. Во-первых, что, если функция и так может вернуть любой тип значения? Для неё сложно найти специальное значение, которое будет отличаться от допустимого результата.
Вторая проблема – работа со специальными значениями может замусорить код. Если функция promptNumber
вызывается 10 раз, то надо 10 раз проверить, не вернула ли она null
. Если реакция на null
заключается в возврате null
на уровень выше, тогда там, где вызывался этот код, тоже нужно встраивать проверку на null
, и так далее.
- 8. Поиск и обработка ошибок
- Перехват ошибок
- Обработка перехваченных ошибок
- Приложение 10. Коды ошибок
- B1.7. Функции обработки ошибок
- Обработка ошибок
- Что обозначают номера ошибок?
- Глава 17. Создание пакетов и распространение программ
- Проверка диска на наличие ошибок
- 17.3.6. Распространение событий
- А.2. Поиск ошибок в динамической памяти
- Г.3. Стандартные функции обработки ошибок