Где поймать ИСКЛЮЧЕНИЕ, выброшенное в EVAL

Следующий скрипт позволяет запустить фрагмент кода javascript. Ошибки перехватываются блоком try/catch.

    try {
        var result = eval(script);
    } catch (e) {
        // do something meaningful
    }

Однако, если переменная script содержит, например, вызов AJAX, и этот вызов ajax вызывает исключение (например, в функции успеха), это исключение НЕ будет перехвачено этим блоком try/catch...

    // execute an AJAX request
        var script = '$.ajax(url:"/somewhere", success: function(){throw new MyException('testexception')})';
    try {
        var result = eval(script);
    } catch (e) {
        // will not be triggered...
    }

Вопрос: как я могу поймать исключение, созданное в запросе ajax?


person itsame69    schedule 01.06.2017    source источник
comment
Помимо того, что eval вообще не используется, даже если вы его не используете и у вас есть эта функция внутри блока try/catch, она не перехватит исключение из функции success, потому что это обратный вызов. Этот код не будет вызываться до тех пор, пока вы не выйдете из своего try/catch   -  person Matt Burland    schedule 01.06.2017
comment
Разве это не добавление обратного вызова ошибки в запросе ajax?   -  person Huangism    schedule 01.06.2017
comment
@MattBurland согласен на 100%, но это мой вопрос...   -  person itsame69    schedule 01.06.2017
comment
@ Хуангизм нет. не думаю так.   -  person itsame69    schedule 01.06.2017
comment
Короче говоря, вам нужно поймать исключение в обратном вызове в обратном вызове   -  person Matt Burland    schedule 01.06.2017
comment
попробуйте добавить в ajax async:false   -  person Dani    schedule 01.06.2017
comment
jQuery устарел async: false. api.jquery.com/jquery.ajax   -  person idream1nC0de    schedule 01.06.2017
comment
@MattBurland хорошо, Мэтт... Спасибо за помощь!   -  person itsame69    schedule 01.06.2017
comment
@itsame69 Посмотрите мой ответ ниже, чтобы узнать, как решить эту проблему.   -  person idream1nC0de    schedule 01.06.2017
comment
@ Дэни/Джейкоб Извините, но это не решение.   -  person itsame69    schedule 01.06.2017


Ответы (1)


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

При этом проблема заключается в том, что обратный вызов успеха вызывается после блока catch. Вам нужно будет либо добавить блок try/catch в обратный вызов успеха, либо вам нужно будет обработать ошибку с более глобальной точки зрения. Одна идея, которую я могу придумать, это использование window.onerror событие. У меня есть пример ниже, который показывает что-то похожее на вашу проблему, и тот, который показывает, что вы можете отлавливать ошибки, возникающие в eval.

(function() {

  'use strict';

  window.addEventListener('error', e => console.log(`window.onerror: ${e.message}`));

  let script = `setTimeout(function() {
    throw new Error('Whoops!');
  }, 0);`;

  eval(script);

  script = `throw new Error('Whoops!');`;

  try {
    eval(script);
  } catch (e) {
    console.log(e.message);
  }

})();

person idream1nC0de    schedule 01.06.2017