Работа с исключениями

Избитая тема, ну да ладно, пишу с примерами. Коротко правила работы выражаются двумя тезисами:

  • исключение это не способ вернуть ответ из функции
  • если не можешь обработать исключение - отпусти его

Итак, у нас есть функция которая работает с некоторым АПИ

function getProperty(key) { let property = Api.getProperty(key); if(typeof property === 'undefined') { //на самом деле исключение должно выкинуть апи //но оно почему то этого не умеет и нам всё пришлось делать за него throw ProperyException(); } return property; }

Далее мы имеем какой то клиентский код, который должен получить значение параметра

function main() { let exampleProperty = getProperty('example'); console.log('My property value is:' + exampleProperty); }

Итак, всё хорошо, и мы полагаемся на то метод getProperty вернёт значение, и потом мы его приклеем к нашей строке и всё будет хорошо. Но что если метод вернёт нам null, конечно  нас это не сильно волнует,  у нас же JS и приведение типов и всё такое, и может быть нас это и строит, но по факту - представим что мы не должны показывать Null как строку.

В ситуации когда приложение может работать без данных, мы должны предполагать что данные могут быть не получены! По старинке это делается так

function main() { //предпологаем что мы не выбрасывали исключение, а вернули null let exampleProperty = getProperty('example'); if(exampleProperty === null) { exampleProperty = 'Property not found'; } console.log('My property value is:' + exampleProperty); }

В случае организации кода с исключениями, в местах где мы можем продолжить работу без исключений мы делаем так:

function main() { let exampleProperty; try { exampleProperty = getProperty('example'); } catch(e) //в этом примере нам не важно что послужило причиной отказа { exampleProperty = 'Property not found'; } console.log('My property value is:' + exampleProperty); }

Таким образом, мы обрабатываем исключение только в местах где мы можем продолжить работу в случае возникновения исключения, нам не нужно везде проверять что наша функция вернула null, мы ловим исключения только там где мы можем его исправить, а где не можем - не ловим.

Фактически, ничего не меняется для нашего приложения, если наше приложение может работать с потерей функциональности некоторых функций - мы явно закладываем эту возможность в наш код. Если мы не можем работать с потерей функциональности - ничего не меняется, так как в случае если какая та функция вернёт невалидный результат который не будет обработан, наше приложение закрашится и остановит работу.

Тогда спрашивается, а заем же тогда исключения, а пригодны они как раз для того, чтобы мы обрабатывали ошибки только в тех местах, которые могут продолжить работу при отказе какой то функции, и не беспокоились об этом в других местах нашего приложения.


Авторизуйтесь чтобы оставлять комментарии