Почему в JavaScript не используется чаще всего Try/Catch?

Похоже, что на других языках, поддерживающих Try/Catch, разработчики используют эту функцию больше, чем в JavaScript. Для этого есть причина? Является ли реализация JS Try/Catch ошибочной?

Ответ 1

Попробуйте взглянуть на эту статью: http://dev.opera.com/articles/view/efficient-javascript/?page=2#trycatch

Из приведенной выше ссылки:

Конструкция try-catch-finally довольно уникальна. В отличие от других конструкций, создает новую переменную в текущей области действия во время выполнения. Это происходит каждый раз, когда выполняется предложение catch, где выделенный объект исключения присваивается переменной. Эта переменная не существует внутри других частей script даже внутри той же области. Он создается в начале предложения catch, а затем уничтожается в конце его.

Поскольку эта переменная создается и уничтожается во время выполнения и представляет собой особый случай на языке, некоторые браузеры не обрабатывают ее очень эффективно, а размещение обработчика catch в критическом состоянии петля может вызвать проблемы с производительностью, если исключения пойманы.

Вы также можете просмотреть аналогичный вопрос здесь

UPDATE

Добавление ссылки на: https://github.com/petkaantonov/bluebird/wiki/Optimization-killers, поскольку содержит полезную информацию о V8 и как она обрабатывает эти (и подобные) конструкции.

В частности:

В настоящее время не оптимизируется:

  • Функции генератора
  • Функции, содержащие оператор for-of
  • Функции, содержащие оператор try-catch
  • Функции, содержащие оператор try-finally
  • Функции, содержащие составное присвоение
  • Функции, которые содержат составное назначение const
  • Функции, содержащие литералы объектов, содержащие Прото, или или установить объявления.

Вероятно никогда не оптимизируется:

  • Функции, содержащие оператор отладчика
  • Функции, которые вызывают буквально eval()
  • Функции, содержащие оператор with with

Ответ 2

Нет, он не испорчен, но для синхронного кода обычно проще и чище проверять вещи с помощью собственного кода, чем использовать неуклюжий try{}catch(e){}.

Пример:

var container = document.getElementById("timmy");
container.innerHTML = "I'm timmy!";

Если нет элемента с идентификатором "timmy", мы можем справиться с этим так:

try
{
    container.innerHTML = "I'm timmy";
}
catch (error)
{
    //handle no container
}

или

if(container) container.innerHTML = "I'm timmy";
else //handle no container

Еще одна вещь, о которой следует помнить, - это приложения JavaScript, управляемые событиями, и блоки try/catch в основной части вашей программы не могут уловить ошибки, возникающие в обратных вызовах событий.

Пример:

sqlConnection.query("SELECT * FROM table", 
    function(){console.log("queried!");});

который будет запускать некоторый собственный код, который запускается по мере продолжения вашей программы. Если возникла ошибка, вы не можете ожидать, что ваша программа вернется к этой строке, чтобы ваш обработчик ошибок мог делать свои вещи! Вместо этого вы обрабатываете ошибки в обратном вызове. Общепринятой практикой является предоставление обратных вызовов с любой ошибкой, которая произошла путем передачи ее в качестве первого параметра.

sqlConnection.query("SELECT * FROM table", 
    function(error, data){
        if(error) console.log("query failed");
        else console.log("queried!");
    });

В качестве альтернативы, если ваш код не работает в обратном вызове, вы можете обращаться с ним так, как я упоминал выше.

link.onclick = function(e)
{
    var popUp = document.getElementById("popup");
    if(!popUp)
        return true; //follow link if no pop-up exists
    popUp.style.display = "block";
};

Ответ 3

Асинхронный характер большинства javascript-кодов скрывает попытку /catch на низком уровне, а затем вызывает обратный вызов ошибки.

Самый тяжелый код в js - асинхронный и использует шаблон обратного вызова или обещания. Другой код прост и не требует try/catch.

Если вы копаетесь в js-библиотеках (выберите ваш любимый), вы найдете блоки try/catch, которые переносят большую часть тяжелого кода приложения, который выполняется в современных js-приложениях. Затем эти библиотеки вызывают обратный вызов с ошибкой или сбоем, который вы видите во многих примерах кода js.

Ответ 4

Я считаю, что с try/catch есть больше накладных расходов, в отличие от оператора if, хотя я думаю, что это имеет значение только тогда, когда на самом деле возникает исключение. Я часто использую try/catch, но только если я знаю, что будет хороший шанс, что можно было бы исключить.

Если эффективно использовать, на самом деле нет причин не использовать try/catch.

Ответ 5

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