Операция Catch не выдает заброшенной ошибки

По какой-то причине этот код дает мне ошибку неперехваченного исключения. Кажется, блок catch не поймал ошибку. Являются ли попытки блокировки блокироваться таким образом, что я не могу сбросить ошибку во вложенной функции, а затем ожидать, что она будет поймана с помощью оператора catch, охваченного выше цепочки? Некоторые из конфиденциальных данных в приложении, в котором я работаю, были удалены, но он ожидал, что leadInfo [0/1] будет 32-символьной буквенно-цифровой строкой, которую я вытаскиваю из параметров URL.

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

    jQuery(document).ready(function(){
        try {
            url = "http://api.com/api/v1/lead/" + leadInfo[1]

            jQuery.ajax({
                type: 'GET',
                contentType: 'application/json',
                url: url,
                dataType : 'jsonp',
                success: function (result) {

                    result = jQuery.parseJSON(result);

                    if(!result.data.email){
                        throw ('New exception');
                    }
                    console.log(result);
                    jQuery('.email').html(result.data.email);
                }
            });


            jQuery('.surveryButton').click(function(){
                window.location.replace("http://" + pgInventory.host + pgInventory.path + leadInfo[0] + "&curLeadId=" + leadInfo[1] + "&curViewedPages=0");
            });
        }
        catch(err) {
            jQuery('.email').html('your e-mail address');
            jQuery('#arrowContent').remove();
        }
});

Ответ 1

Причина отказа вашего блока try catch заключается в том, что запрос ajax является асинхронным. Блок catch try будет выполняться перед вызовом Ajax и отправляет сам запрос, но ошибка возникает, когда возвращается результат, AT LATER POINT IN TIME.

Когда выполняется блок try catch, ошибки нет. Когда ошибка выбрасывается, нет try catch. Если вам нужны try catch для запросов ajax, всегда помещайте блоки ajax try catch внутри обратного вызова success, НИКОГДА вне его.

Вот как это сделать:

success: function (result) {
    try {
      result = jQuery.parseJSON(result);

      if (!result.data.email) {
         throw ('New exception');
      }
      console.log(result);
      jQuery('.email').html(result.data.email);
    } catch (exception) {
      console.error("bla");
    };
}

Ответ 2

Проблема заключается в том, что ajax по определению является асинхронным. Ваше исключение не выбрасывается из функции $.ajax, а из функции callback при успешном завершении (которое запускается позднее).

Вам следует указать параметр error: function(data) {}, чтобы обрабатывать ошибки ответа сервера, и, кроме того, вы должны поместить блок try/catch внутри функцию обратного вызова.

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

Ответ 3

Из-за асинхронного характера методов обратного вызова в javascript контекст функции, генерирующей ошибку, отличается от исходного. Вы должны сделать так:

success: function (result) {
  try {
    result = jQuery.parseJSON(result);
    if(!result.data.email){
      throw ('New exception');
    }
    console.log(result);
    jQuery('.email').html(result.data.email);
  }
  catch(err) {
    // Dealing with the error
  }
}

Я бы посоветовал вам взглянуть на этот отличный article об особенностях , закрытия и привязки в javascrit