JavaScript перебрасывает исключение, сохраняя трассировку стека - PullRequest
3 голосов
/ 09 марта 2011

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

} catch (e) {
    if (foo(e)) {
        // handle the exception
    } else {
        // The stack traces points here
        throw e;
    }
}

К сожалению, следующий код в jQuery.js приводит к возникновению этой проблемы во всех исключениях, если они изнутри обработчиков событий.

try {
    while( callbacks[ 0 ] ) {
        callbacks.shift().apply( context, args );
    }
}
// We have to add a catch block for
// IE prior to 8 or else the finally
// block will never get executed
catch (e) {
    throw e;
}
finally {
    fired = [ context, args ];
    firing = 0;
}

Есть ли способ изменить throw e;, чтобы исключение было переброшено с той же трассировкой стека?

Ответы [ 3 ]

2 голосов
/ 09 марта 2011

Это известная ошибка в Chrome , и, к сожалению, я не знаю обходного пути.

0 голосов
/ 28 января 2019

В моей ситуации console.log () не удалось.Что я сделал, это:

}catch( error ){
 // 'throw' replaces the stack trace.
 // To preserve the stack add it to the message.
 error.message += '; Stack trace: ' + error.stack;
 throw error;
}
0 голосов
/ 12 апреля 2016

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

try{
  ...
}
catch(e){
    console.log(e.stack);
    console.log(e.message);
    throw(e);
}
...