Обработка ошибок Javascript с помощью try .. catch .. finally

У меня есть подозрение, что я неправильно использую блок finally, и что я не понимаю основ его назначения ...

 function myFunc() {
      try {
           if (true) {
                throw "An error";
           }
      } catch (e) {
           alert (e);
           return false;
      } finally {
           return true;
      }
 }

Эта функция запустит блок catch, выдаст предупреждение «Ошибка», но затем вернет истину. Почему не возвращается false?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
55
0
41 427
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

The finally block contains statements to execute after the try and catch blocks execute but before the statements following the try...catch statement. The finally block executes whether or not an exception is thrown. If an exception is thrown, the statements in the finally block execute even if no catch block handles the exception. more

Блок finally будет работать всегда, попробуйте вернуть true после блока try

function myFunc() {
     try {
         if (true) {
               throw "An error";
          }
          return true;
     } catch (e) {
          alert (e);
          return false;
     } finally {
          //do cleanup, etc here
     }
 }

Блоки finally выполняются, когда вы покидаете блок try. В вашем коде это происходит, когда вы возвращаете false. Это устанавливает возвращаемое значение false и пытается выйти из функции. Но сначала он должен выйти из блока try, который запускает finally и перезаписывает возвращаемое значение на true.

Многие считают хорошей практикой программирования иметь один оператор возврата для каждой функции. Подумайте о том, чтобы сделать var retval в начале вашей функции и установить для него значение true или false, в зависимости от ситуации, во всей функции, а затем структурировать код так, чтобы он правильно переходил к единственному возврату внизу.

Использование одного возвращаемого значения - одна из действенных и полезных стратегий для решения проблемы упрощения цели и ясности функций. Использование переменной для хранения возвращаемого значения также является допустимым средством решения сложной логики возвращаемого значения. Однако я не думаю, что можно сказать, что несколько операторов return в функции автоматически являются признаком плохой практики программирования. Во многих случаях это просто прекрасно: проще писать код и ясно передавать намерения функции следующему программисту, который должен это понимать. function a(i) {if (i===undefined) {return;} ...}

ErikE 04.04.2011 23:42

Это заявление о возврате вверху предельно ясно. Заставлять всю функцию располагаться внутри if-блока просто не нужно.

ErikE 04.04.2011 23:43
function getTheFinallyBlockPoint(someValue) {
    var result;
    try {
        if (someValue === 1) {
            throw new Error("Don't you know that '1' is not an option here?");
        }
        result = someValue
    } catch (e) {
        console.info(e.toString());
        throw e;
    } finally {
        console.info("I'll write this no matter what!!!");
    }

    return result;
};

getTheFinallyBlockPoint("I wrote this only because 'someValue' was not 1!!!");
getTheFinallyBlockPoint(1);

Запустите это на консоли своего браузера, и он может дать вам ответ, который вы ищете.

Другие вопросы по теме