Как отладить мой асинхронный код, основанный на обещаниях, если библиотека поглощает все исключения? - PullRequest
15 голосов
/ 08 февраля 2012

Проблема

JSFiddle : http://jsfiddle.net/missingno/Gz8Pe/2/

У меня есть код, который выглядит следующим образом:

var d = new Deferred();
d.resolve(17);
return d.then(function(){
     //do some stuff...
})
.then(function(){
    var obj = a_funtion_that_returns_null_on_IE();
    var x = obj.some_property; //BOOM!
});

Проблема в том, чтокогда я в IE, все, что я вижу, это 'obj' is null or not an object ошибки, без какой-либо ссылки на соответствующий номер строки и без остановки отладчика на ошибочной строке (как хотелось бы).

Эта проблема делает код трудным для отладки, и единственные решения, о которых я могу подумать прямо сейчас (возиться с библиотекой потока управления или прибегнуть к пошаговой отладке с помощью отладчика или console.log),вещи, которые я бы предпочел не делать.

То, что я думаю, происходит

Чтобы разрешить добавление ошибок после запуска цепочки, then превентивно перехватит любые исключенияпо обратным вызовам.Я думаю, что это причина того, что отладчик IE не останавливается на ошибке или показывает обычное сообщение об ошибке с номером строки в нем.

Сообщения об ошибках без номеров строк поступают из библиотеки потока управления:он обеспечивает deferredOnError ловушку, которая вызывается всякий раз, когда исключение перехватывается и сохраняется для последующего использования, а поведение по умолчанию - console.erroring объекта Error:

dojo.config.deferredOnError = function(err){
    //a chance to log the exception after it is captured by "then"
    //or do other things with it
    console.error(err);
}

К сожалению, я не смог выяснитьспособ получить номер строки или трассировку стека из объекта ошибки в IE, и ловушка вызывается так, что я не могу просто перебросить исключение и позволить ему всплыть на верхний уровень.

Что яхочу

Я хочу иметь лучший способ отладки асинхронного кода, а затем пошагово идти вместе с отладчиком.В лучшем случае способ остановить отладчик исключений (как это происходит с необработанными исключениями) или хотя бы способ получить номера строк или трассировки стека изОшибка объекта , который был брошен.

Ответы [ 3 ]

12 голосов
/ 11 ноября 2014

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

Пауза при обнаружении исключений: Это фактически остановит выполнение javascript и точно покажет, где находится проблемный код, как это происходит.

Pause On Caught Exceptions

в Chrome:

  1. Инструменты разработчика ,
  2. Источники вкладка,
  3. Пауза при исключениях (значок остановки) и затем
  4. Пауза при обнаружении исключений флажок
4 голосов
/ 27 апреля 2012

Что я в итоге сделал

Я добавил функцию секвенирования в свою мини-библиотеку асинхронных вспомогательных функций. По сути, он выполняет последовательность вызовов «then», за исключением того, что добавляет дополнительные промежуточные шаги для переброса любых исключений, которые в конечном итоге перехватываются отложенными. Он также принимает необязательный обработчик ошибок для перехвата исключений.

Когда я это называю, это выглядит так:

go([
    function(){
        return 17;
    },
    function(x){
        //return some stuff
    },
    function(){
         var obj = a_function_that_returns_null_on_IE();
         var x = obj.some_property; //BOOM!
    }
], function(){
    //an optional error handler
});

Другая причина, по которой я так поступил, заключается в том, что у меня много кода, который должен работать одновременно с синхронизирующим или асинхронным кодом (используя Deferred.when для создания цепочки). Использование моей пользовательской функции позволяет мне использовать единый унифицированный синтаксис, и ошибки, которые не фиксируются в асинхронном случае, соответствуют случаю синхронизации, в котором не задействованы отложенные элементы. Я также думаю, что все в порядке, чтобы не фиксировать ошибку, поскольку в отличие от общего случая, когда я использую «go», я априори знаю, какой код будет вызываться, поэтому нет необходимости перехватывать исключения, если кому-то нужно перехватить их в будущем.

Кроме того, использование нестандартного решения дало мне свободу применять некоторые личные настройки дизайна:)


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

Кроме того, мы убедились, что любые исключения, которые мы создаем сами, являются экземплярами встроенного класса Error, целого ряда других объектов. Причина в том, что встроенный класс Error записывает номер строки и трассировку стека, где он был сгенерирован, кросс-браузерным способом.

3 голосов
/ 04 марта 2016

2016 решение

Если вы используете нативные обещания ES, ничего не делайте;Chrome автоматически сообщает о непринятом отклонении обещания в консоли.

Обратите внимание, что пойманный (Second fail) не показывает ничего, кроме необученного отклоненияпоявляется в консоли после выполнения кода.

...