Мы пытаемся настроить детектор глобальных неуправляемых ошибок верхнего уровня в нашем гибридном приложении Ionic 1.Следуя этой документации , мы подписались на window.addEventListener
, чтобы сделать это, но она почти ничего не захватывает.Затем мы начали использовать Angle's $ exceptionHandler , и это частично решает проблему, но в ней по-прежнему отсутствуют ошибки HTTP и сценариев.Подробности:
- ошибки ресурса (ошибки загрузки изображения, ошибки синтаксического анализа скрипта) не обрабатываются ни
window.addEventListener
, ни $ AngleHandler - Angular, выдаваемыми при загрузке контроллера, ионными событиями, такими как
beforeEnter
, ионные методы, вызываемые из пользовательского интерфейса через привязки событий шаблонов, вызовы ajax ... ни один из них не обрабатывается window.addEventListener
- $ exceptionHandler от Angular не обрабатывает их - Удивительно, но весь код, запланированный с помощью
setTimeout
из всех этих мест правильно обрабатывается window.addEventListener
Следующие файлы демонстрируют все, что было гарантировано:
// app.js
angular.module("starter", [dependencies]).config(function () {
window.addEventListener("error", function (event) {
console.error("Error caught", event);
});
});
.
// controllers.js
angular.module('starter.controllers', [dependencies]).controller("HomeCtrl", function ($scope, $http) {
var nullVariable = null;
var assignmentTarget;
$scope.testClick = function () {
setTimeout(function () {
assignmentTarget = nullVariable.testClickTimeout; // handled
}, 0);
assignmentTarget = nullVariable.testClick; // unhandled
};
$scope.$on('$ionicView.beforeEnter', function () {
setTimeout(function () {
assignmentTarget = nullVariable.homeCtrlBeforeEnterTimeout; // handled
}, 0);
assignmentTarget = nullVariable.homeCtrlBeforeEnter; // unhandled
});
$http({
method: "GET",
responseType: "json",
url: "comeurl"
}).then(function (response) {
setTimeout(function () {
assignmentTarget = nullVariable.ajaxResponseTimeout; // handled
}, 0);
assignmentTarget = nullVariable.ajaxResponse; // unhandled
});
setTimeout(function () {
assignmentTarget = nullVariable.homeCtrlTimeout; // handled
}, 0);
assignmentTarget = nullVariable.homeCtrl; // unhandled
});