Операция 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