На мой взгляд, исключения являются важным инструментом для обнаружения ошибок кода во время выполнения. Как в тестах, так и в производстве. Сделайте их сообщения достаточно многословными, чтобы в сочетании с трассировкой стека вы могли выяснить, что произошло из журнала.
Исключения - это в основном инструмент разработки и способ получения разумных отчетов об ошибках в производственной среде в непредвиденных случаях.
Помимо разделения интересов (удачный путь только с ожидаемыми ошибками и провал до достижения какого-то общего обработчика непредвиденных ошибок), являющегося хорошей вещью, делающего ваш код более читабельным и обслуживаемым, фактически невозможно подготовить ваш код для всех возможных непредвиденные случаи, даже вздувая его с кодом обработки ошибок, чтобы завершить нечитаемость.
Это на самом деле означает «неожиданный».
Кстати, что ожидается, а что нет, это решение, которое может быть принято только на сайте вызова. Вот почему проверенные исключения в Java не сработали - решение принимается во время разработки API, когда совсем не ясно, что ожидается или неожиданно.
Простой пример: API хеш-карты может иметь два метода:
Value get(Key)
а также
Option<Value> getOption(key)
первое выдает исключение, если не найдено, последнее дает необязательное значение. В некоторых случаях последний имеет больше смысла, но в других ваш код просто должен ожидать, что для данного ключа будет значение, поэтому если его нет, то это ошибка, которую этот код не может исправить, так как основной предположение не удалось. В этом случае на самом деле желаемое поведение выпадать из пути кода и переходить к некоторому универсальному обработчику в случае сбоя вызова.
Кодекс никогда не должен пытаться справиться с ошибочными базовыми предположениями.
Конечно, кроме проверки их и создания хорошо читаемых исключений.
Бросать исключения - не зло, но ловить их можно. Не пытайтесь исправить неожиданные ошибки. Поймайте исключения в нескольких местах, где вы хотите продолжить цикл или операцию, зарегистрируйте их, возможно, сообщите о неизвестной ошибке, и все.
Поймать блоки повсюду - очень плохая идея.
Создайте свои API-интерфейсы таким образом, чтобы с легкостью выразить свое намерение, т.е. заявить, ожидаете ли вы определенного случая, например, ключ не найден или нет. Пользователи вашего API могут затем выбирать вызов только для действительно неожиданных случаев.
Я предполагаю, что причина, по которой люди возмущаются исключениями и зашли слишком далеко, опуская этот критически важный инструмент для автоматизации обработки ошибок и лучшего отделения проблем от новых языков, - это плохой опыт.
Это и некоторое недопонимание того, для чего они на самом деле хороши.
Имитация их путем выполнения ВСЕХ через монадическое связывание делает ваш код менее читаемым и обслуживаемым, и вы в конечном итоге не получаете трассировки стека, что делает этот подход НАМНОГО хуже.
Обработка ошибок в функциональном стиле отлично подходит для ожидаемых ошибок.
Пусть обработка исключений автоматически позаботится обо всем остальном, вот для чего это :)
panic
что не совсем то же самое. В дополнение к тому, что там сказано, исключение - это не более чем сложный (но удобный) способ выполненияGOTO
, хотя никто не называет это так по понятным причинам.