Должен ли я самостоятельно определять DEBUG и изменять его каждый раз, когда я изменяю объект Building-Target, или есть слово, которое я не знаю?
blockquote>I не знаю, что, если по умолчанию установлено значение Code :: Blocks. Но, если вы определяете свои собственные #defines
Project->Build options...->[Debug|Release]->#defines
, вам не нужно их менять при переключении между целями сборки (DEBUG или RELEASE). Он позволяет вам определять значения, специфичные для сборки Debug, а также значения, характерные для сборки Release.
Чтобы избежать необходимости вручную вводить его каждый раз для каждого нового проекта, вы можете сделать небольшой проект только с вашими параметрами Debug / Release #defines и сохраните их как шаблон проекта, а затем создайте новые проекты из этого шаблона проекта.
В обратном вызове ошибки или $. Ajax у вас есть три входных аргумента:
function (XMLHttpRequest, textStatus, errorThrown) {
this; // options for this ajax request
}
Вы можете напрямую проверить xhr.status
, чтобы получить код ответа HTTP, например:
$.ajax({
url: "test.html",
cache: false,
success: function(html){
$("#results").append(html);
},
error: function (xhr, textStatus) {
if (xhr.status == 500) {
alert('Server error: '+ textStatus);
}
}
});
Редактировать: Чтобы определить разницу между разрывом соединения браузером и случаем, когда сервер не работает (комментарий Джейсонмерино):
При выгрузке значение xhr.readyState должно быть равно 0, а для сервера без отклика значение xhr.readyState должно быть равно 4.
(Я бы добавил это как комментарий к основному ответу, но пока не набрал достаточно очков, чтобы сделать это!)
Я также вижу это в FF4 и хром (9.0.597.107). Вероятно, в другом месте, но этого достаточно, чтобы я захотел это исправить!
Одна из странностей в этой ситуации - возвращение XMLHttpRequest.status === 0
, который выглядит как надежный способ обнаружить эту ситуацию и, в моем конкретном случае, прервать пользовательскую обработку ошибок, отображаемую для пользователя:
error: function (XMLHttpRequest, textStatus, errorThrown) {
if (XMLHttpRequest.status === 0) return;
// error handling here
}
Также стоит упомянуть, что в предположении, что может быть проблема в синтаксическом анализе JSON любого браузер возвращает вызов $ .ajax (), я также попытался обменять собственный JSON.stringify для версии Дугласа Крокфорда ( https://github.com/douglascrockford/JSON-js ) но это не имело никакого значения.
Обратный вызов ошибки должен получить ссылку на объект XHR, проверить код состояния, чтобы узнать, является ли это ошибкой сервера или нет?
Если вы используете функции jQuery, такие как $.get
, $.post
, $.ajax
... тогда вы можете использовать параметр text_status
, чтобы проверить, какой тип ошибки:
request = $.get('test.html', function(data){
//whatever
}).fail(function(xhr, text_status, error_thrown) {
if(text_status!== 'abort'){
console.warn("Error!!");
}
});
Из документов jQuery :
jqXHR.fail (функция (jqXHR, textStatus, errorThrown) {}); Альтернативная конструкция для ошибки Опция обратного вызова, метод .fail () заменяет устаревший метод .error (). Обратитесь к deferred.fail () за подробностями реализации.
С этим трудно справиться правильно во всех ситуациях. К сожалению, во многих популярных браузерах xhr.status
является тем же (0
), если вызов AJAX отменен навигацией или сервером, который не работает / не отвечает. Так что эта техника редко работает.
Вот набор очень «практичных» хаков, которые я накопил, которые работают довольно хорошо в большинстве случаев, но все еще не пуленепробиваемы. Идея состоит в том, чтобы попытаться перехватить события навигации и установить флаг, который проверяется в обработчике ошибок AJAX. Как это:
var global_is_navigating = false;
$(window).on('beforeunload',function() {
// Note: this event doesn't fire in mobile safari
global_is_navigating = true;
});
$("a").on('click',function() {
// Giant hack that can be helpful with mobile safari
if( $(this).attr('href') ) {
global_is_navigating = true;
}
});
$(document).ajaxError(function(evt, xhr, settings) {
// default AJAX error handler for page
if( global_is_navigating ) {
// AJAX call cancelled by navigation. Not a real error
return;
}
// process actual AJAX error here.
});