JavaScript Глобальный механизм событий -- javascript поле с участием dom-events пол Связанный проблема

JavaScript global event mechanism


362
vote

проблема

русский

Я хотел бы поймать каждую неопределенную ошибку функции. Есть ли глобальная обработка ошибок в JavaScript? Чехол на использование ловит вызовы функций от Flash, которые не определены.

Английский оригинал

I would like to catch every undefined function error thrown. Is there a global error handling facility in JavaScript? The use case is catching function calls from flash that are not defined.

</div
     
   
   

Список ответов

199
 
vote
vote
Лучший ответ
 

Это поможет вам:

 <код> <script type="text/javascript"> window.onerror = function() {     alert("Error caught"); };  xxx(); </script>   

Я не уверен, как это обрабатывает ошибки вспышки, хотя ...

Обновление: это не работает в Opera, но я сейчас взломаю стрекоза, чтобы увидеть, что он получает. Предложение о взломании стрекоза произошла с этого вопроса:

Мимическое окно. OneRror в Opera с помощью JavaScript

 

Does this help you:

<script type="text/javascript"> window.onerror = function() {     alert("Error caught"); };  xxx(); </script> 

I'm not sure how it handles Flash errors though...

Update: it doesn't work in Opera, but I'm hacking Dragonfly right now to see what it gets. Suggestion about hacking Dragonfly came from this question:

Mimic Window. onerror in Opera using javascript

</div
 
 
         
         
649
 
vote

Как поймать необработанные ошибки JavaScript

Назначить <код> window.onerror событие на обработчик события, как:

 <код> <script type="text/javascript"> window.onerror = function(msg, url, line, col, error) {    // Note that col & error are new to the HTML 5 spec and may not be     // supported in every browser.  It worked for me in Chrome.    var extra = !col ? '' : ' column: ' + col;    extra += !error ? '' : ' error: ' + error;     // You can view the information in an alert to see things working like this:    alert("Error: " + msg + " url: " + url + " line: " + line + extra);     // TODO: Report this error via ajax so you can keep track    //       of what pages have JS issues     var suppressErrorAlert = true;    // If you return true, then error alerts (like in older versions of     // Internet Explorer) will be suppressed.    return suppressErrorAlert; }; </script>   

Как прокомментировано в коде, если возвращаемое значение window.onerror true , затем браузер должен подавлять диалог оповещения.

Когда окажется окно.oneRror событие?

в двух словах, событие поднимается, когда либо 1.) происходит неосторожное исключение или 2.) Происходит ошибка времени компиляции.

unciled Исключения

    .
  • бросить "Некоторые сообщения"
  • call_something_endefined ();
  • cross_origin_iframe.contentwindow.document;, исключение безопасности

Ошибка компиляции

    .
  • <код> <script>{</script>
  • <код> <script>for(;)</script>
  • <код> <script>"oops</script>
  • <код> setTimeout("{", 10); , он попытается скомпилировать первый аргумент как Сценарий

браузеры, поддерживающие window.oneRor

    .
  • Chrome 13 +
  • firefox 6.0 +
  • Internet Explorer 5.5 +
  • Opera 11.60 +
  • safari 5.1 +

Скриншот:

Пример примера кода ONERROR выше в действии после добавления этого на страницу теста:

 <код> <script type="text/javascript"> call_something_undefined(); </script>   

javascript Alert показывает информацию об ошибке, подробно описанную по событию Window.OneRror

Пример для отчеты об ошибке AJAX

 <код> var error_data = {     url: document.location.href, };  if(error != null) {     error_data['name'] = error.name; // e.g. ReferenceError     error_data['message'] = error.line;     error_data['stack'] = error.stack; } else {     error_data['msg'] = msg;     error_data['filename'] = filename;     error_data['line'] = line;     error_data['col'] = col; }  var xhr = new XMLHttpRequest();  xhr.open('POST', '/ajax/log_javascript_error'); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.onload = function() {     if (xhr.status === 200) {         console.log('JS error logged');     } else if (xhr.status !== 200) {         console.error('Failed to log JS error.');         console.error(xhr);         console.error(xhr.status);         console.error(xhr.responseText);     } }; xhr.send(JSON.stringify(error_data));   

jsfiddle:

https://jsfiddle.net/nzfvm44d/

Ссылки:

    .
  • Mozilla Developer Network :: window.oneRror
  • MSDN :: Disingling и избегание ошибок веб-страницы Часть 2: ошибки времени выполнения
  • Вернуться к основам - JavaScript OneRror Event
  • dev.opera :: Лучше обращение с ошибкой window.oneRror
  • Окно OneRror Event
  • Использование события OneRror для подавления ошибок JavaScript
  • Так :: window.oneRor не стреляют в Firefox
 

How to Catch Unhandled Javascript Errors

Assign the window.onerror event to an event handler like:

<script type="text/javascript"> window.onerror = function(msg, url, line, col, error) {    // Note that col & error are new to the HTML 5 spec and may not be     // supported in every browser.  It worked for me in Chrome.    var extra = !col ? '' : ' column: ' + col;    extra += !error ? '' : ' error: ' + error;     // You can view the information in an alert to see things working like this:    alert("Error: " + msg + " url: " + url + " line: " + line + extra);     // TODO: Report this error via ajax so you can keep track    //       of what pages have JS issues     var suppressErrorAlert = true;    // If you return true, then error alerts (like in older versions of     // Internet Explorer) will be suppressed.    return suppressErrorAlert; }; </script> 

As commented in the code, if the return value of window.onerror is true then the browser should suppress showing an alert dialog.

When does the window.onerror Event Fire?

In a nutshell, the event is raised when either 1.) there is an uncaught exception or 2.) a compile time error occurs.

uncaught exceptions

  • throw "some messages"
  • call_something_undefined();
  • cross_origin_iframe.contentWindow.document;, a security exception

compile error

  • <script>{</script>
  • <script>for(;)</script>
  • <script>"oops</script>
  • setTimeout("{", 10);, it will attempt to compile the first argument as a script

Browsers supporting window.onerror

  • Chrome 13+
  • Firefox 6.0+
  • Internet Explorer 5.5+
  • Opera 11.60+
  • Safari 5.1+

Screenshot:

Example of the onerror code above in action after adding this to a test page:

<script type="text/javascript"> call_something_undefined(); </script> 

Javascript alert showing error information detailed by the window.onerror event

Example for AJAX error reporting

var error_data = {     url: document.location.href, };  if(error != null) {     error_data['name'] = error.name; // e.g. ReferenceError     error_data['message'] = error.line;     error_data['stack'] = error.stack; } else {     error_data['msg'] = msg;     error_data['filename'] = filename;     error_data['line'] = line;     error_data['col'] = col; }  var xhr = new XMLHttpRequest();  xhr.open('POST', '/ajax/log_javascript_error'); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.onload = function() {     if (xhr.status === 200) {         console.log('JS error logged');     } else if (xhr.status !== 200) {         console.error('Failed to log JS error.');         console.error(xhr);         console.error(xhr.status);         console.error(xhr.responseText);     } }; xhr.send(JSON.stringify(error_data)); 

JSFiddle:

https://jsfiddle.net/nzfvm44d/

References:

  • Mozilla Developer Network :: window.onerror
  • MSDN :: Handling and Avoiding Web Page Errors Part 2: Run-Time Errors
  • Back to Basics – JavaScript onerror Event
  • DEV.OPERA :: Better error handling with window.onerror
  • Window onError Event
  • Using the onerror event to suppress JavaScript errors
  • SO :: window.onerror not firing in Firefox
</div
 
 
         
         
39
 
vote

Сложная обработка ошибок

Если ваша обработка ошибок очень сложна и, следовательно, может бросить саму ошибку, полезно добавить флаг, указывающий, если вы уже находитесь в «ReveryBood-Mode». Как так:

 <код> <script type="text/javascript"> window.onerror = function(msg, url, line, col, error) {    // Note that col & error are new to the HTML 5 spec and may not be     // supported in every browser.  It worked for me in Chrome.    var extra = !col ? '' : ' column: ' + col;    extra += !error ? '' : ' error: ' + error;     // You can view the information in an alert to see things working like this:    alert("Error: " + msg + " url: " + url + " line: " + line + extra);     // TODO: Report this error via ajax so you can keep track    //       of what pages have JS issues     var suppressErrorAlert = true;    // If you return true, then error alerts (like in older versions of     // Internet Explorer) will be suppressed.    return suppressErrorAlert; }; </script> 0  

В противном случае вы можете оказаться в бесконечной петле.

 

sophisticated error handling

If your error handling is very sophisticated and therefore might throw an error itself, it is useful to add a flag indicating if you are already in "errorHandling-Mode". Like so:

var appIsHandlingError = false;  window.onerror = function() {     if (!appIsHandlingError) {         appIsHandlingError = true;         handleError();     } };  function handleError() {     // graceful error handling     // if successful: appIsHandlingError = false; } 

Otherwise you could find yourself in an infinite loop.

</div
 
 
       
       
24
 
vote

try atatus , который предоставляет расширенные отслеживание ошибок и реальный мониторинг пользователя для современных веб-приложений.

https://www.atatus.com/

Позвольте мне объяснить, как получить укладки, которые достаточно полны во всех браузерах.

Обработка ошибок в JavaScript

Современный Chrome и Opera полностью поддерживают HTML 5 Speck Spec для Errorevent и window.onerror . В обоих этих браузерах вы можете использовать <код> window.onerror , или связываться с событием «Ошибка» правильно:

 <код> // Only Chrome & Opera pass the error object. window.onerror = function (message, file, line, col, error) {     console.log(message, "from", error.stack);     // You can send data to your server     // sendError(data); }; // Only Chrome & Opera have an error attribute on the event. window.addEventListener("error", function (e) {     console.log(e.error.message, "from", e.error.stack);     // You can send data to your server     // sendError(data); })   

К сожалению, Firefox, Safari и IE все еще вокруг, и мы должны их тоже поддерживать. Поскольку Stacktrace недоступен в window.onerror Мы должны сделать немного больше работы.

Оказывается, что единственное, что мы можем сделать, чтобы получить укладки от ошибок, - это обернуть весь наш код в <код> try{ }catch(e){ } BLOCK, а затем посмотреть <код> e.stack . Мы можем сделать процесс несколько проще с функцией, называемой Wrap, которая принимает функцию и возвращает новую функцию с хорошей обработкой ошибок.

 <код> function wrap(func) {     // Ensure we only wrap the function once.     if (!func._wrapped) {         func._wrapped = function () {             try{                 func.apply(this, arguments);             } catch(e) {                 console.log(e.message, "from", e.stack);                 // You can send data to your server                 // sendError(data);                 throw e;             }         }     }     return func._wrapped; };   

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

Изменяя глобальное определение <код> addEventListener так, чтобы он автоматически обернул обратный вызов, мы можем автоматически вставить <код> try{ }catch(e){ } вокруг большинства кода. Это позволяет существующему коду продолжать работать, но добавляет высококачественное отслеживание исключений.

 <код> var addEventListener = window.EventTarget.prototype.addEventListener; window.EventTarget.prototype.addEventListener = function (event, callback, bubble) {     addEventListener.call(this, event, wrap(callback), bubble); }   

Нам также нужно убедиться, что <код> window.onerror0 продолжает работать. На данный момент это не будет, потому что аргумент <код> window.onerror1 изменен. Снова нам нужно только исправить это только на <код> window.onerror2 объекта:

 <код> window.onerror3  

Передача данных об ошибках на ваш бэкэнд

Вы можете отправлять данные об ошибках, используя тег изображения следующим образом

 <код> window.onerror4  

Отказ от ответственности: Я веб-разработчик на https://www.atatus.com/ . P >.

 

Try Atatus which provides Advanced Error Tracking and Real User Monitoring for modern web apps.

https://www.atatus.com/

Let me explain how to get stacktraces that are reasonably complete in all browsers.

Error handling in JavaScript

Modern Chrome and Opera fully support the HTML 5 draft spec for ErrorEvent and window.onerror. In both of these browsers you can either use window.onerror, or bind to the 'error' event properly:

// Only Chrome & Opera pass the error object. window.onerror = function (message, file, line, col, error) {     console.log(message, "from", error.stack);     // You can send data to your server     // sendError(data); }; // Only Chrome & Opera have an error attribute on the event. window.addEventListener("error", function (e) {     console.log(e.error.message, "from", e.error.stack);     // You can send data to your server     // sendError(data); }) 

Unfortunately Firefox, Safari and IE are still around and we have to support them too. As the stacktrace is not available in window.onerror we have to do a little bit more work.

It turns out that the only thing we can do to get stacktraces from errors is to wrap all of our code in a try{ }catch(e){ } block and then look at e.stack. We can make the process somewhat easier with a function called wrap that takes a function and returns a new function with good error handling.

function wrap(func) {     // Ensure we only wrap the function once.     if (!func._wrapped) {         func._wrapped = function () {             try{                 func.apply(this, arguments);             } catch(e) {                 console.log(e.message, "from", e.stack);                 // You can send data to your server                 // sendError(data);                 throw e;             }         }     }     return func._wrapped; }; 

This works. Any function that you wrap manually will have good error handling, but it turns out that we can actually do it for you automatically in most cases.

By changing the global definition of addEventListener so that it automatically wraps the callback we can automatically insert try{ }catch(e){ } around most code. This lets existing code continue to work, but adds high-quality exception tracking.

var addEventListener = window.EventTarget.prototype.addEventListener; window.EventTarget.prototype.addEventListener = function (event, callback, bubble) {     addEventListener.call(this, event, wrap(callback), bubble); } 

We also need to make sure that removeEventListener keeps working. At the moment it won't because the argument to addEventListener is changed. Again we only need to fix this on the prototype object:

var removeEventListener = window.EventTarget.prototype.removeEventListener; window.EventTarget.prototype.removeEventListener = function (event, callback, bubble) {     removeEventListener.call(this, event, callback._wrapped || callback, bubble); } 

Transmit error data to your backend

You can send error data using image tag as follows

function sendError(data) {     var img = newImage(),         src = 'http://yourserver.com/jserror&data=' + encodeURIComponent(JSON.stringify(data));      img.crossOrigin = 'anonymous';     img.onload = function success() {         console.log('success', data);     };     img.onerror = img.onabort = function failure() {         console.error('failure', data);     };     img.src = src; } 

Disclaimer: I am a web developer at https://www.atatus.com/.

</div
 
 
   
   
21
 
vote

Кажется, что <код> window.onerror не предоставляет доступ ко всем возможным ошибкам. В частности, он игнорирует:

  1. <код> <img> ошибки загрузки (ответы и gt; = 400).
  2. <код> <script> ошибки загрузки (Repeate & GT; = 400).
  3. Глобальные ошибки Если у вас есть много других библиотек в вашем приложении, также манипулирует <код> window.onerror неизвестным способом (jQuery, ingular, etc.).
  4. Вероятно, многие случаи я не столкнулся после изучения этого (Iframes, переполнение стека и т. Д.).

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

 <код> (function(){  /**  * Capture error data for debugging in web console.  */  var captures = [];  /**  * Wait until `window.onload`, so any external scripts  * you might load have a chance to set their own error handlers,  * which we don't want to override.  */  window.addEventListener('load', onload);  /**  * Custom global function to standardize   * window.onerror so it works like you'd think.  *  * @see http://www.quirksmode.org/dom/events/error.html  */  window.onanyerror = window.onanyerror || onanyerrorx;  /**  * Hook up all error handlers after window loads.  */  function onload() {   handleGlobal();   handleXMLHttp();   handleImage();   handleScript();   handleEvents(); }  /**  * Handle global window events.  */  function handleGlobal() {   var onerrorx = window.onerror;   window.addEventListener('error', onerror);    function onerror(msg, url, line, col, error) {     window.onanyerror.apply(this, arguments);     if (onerrorx) return onerrorx.apply(null, arguments);   } }  /**  * Handle ajax request errors.  */  function handleXMLHttp() {   var sendx = XMLHttpRequest.prototype.send;   window.XMLHttpRequest.prototype.send = function(){     handleAsync(this);     return sendx.apply(this, arguments);   }; }  /**  * Handle image errors.  */  function handleImage() {   var ImageOriginal = window.Image;   window.Image = ImageOverride;    /**    * New `Image` constructor. Might cause some problems,    * but not sure yet. This is at least a start, and works on chrome.    */    function ImageOverride() {     var img = new ImageOriginal;     onnext(function(){ handleAsync(img); });     return img;   } }  /**  * Handle script errors.  */  function handleScript() {   var HTMLScriptElementOriginal = window.HTMLScriptElement;   window.HTMLScriptElement = HTMLScriptElementOverride;    /**    * New `HTMLScriptElement` constructor.    *    * Allows us to globally override onload.    * Not ideal to override stuff, but it helps with debugging.    */    function HTMLScriptElementOverride() {     var script = new HTMLScriptElement;     onnext(function(){ handleAsync(script); });     return script;   } }  /**  * Handle errors in events.  *  * @see http://stackoverflow.com/questions/951791/javascript-global-error-handling/31750604#31750604  */  function handleEvents() {   var addEventListenerx = window.EventTarget.prototype.addEventListener;   window.EventTarget.prototype.addEventListener = addEventListener;   var removeEventListenerx = window.EventTarget.prototype.removeEventListener;   window.EventTarget.prototype.removeEventListener = removeEventListener;    function addEventListener(event, handler, bubble) {     var handlerx = wrap(handler);     return addEventListenerx.call(this, event, handlerx, bubble);   }    function removeEventListener(event, handler, bubble) {     handler = handler._witherror || handler;     removeEventListenerx.call(this, event, handler, bubble);   }    function wrap(fn) {     fn._witherror = witherror;      function witherror() {       try {         fn.apply(this, arguments);       } catch(e) {         window.onanyerror.apply(this, e);         throw e;       }     }     return fn;   } }  /**  * Handle image/ajax request errors generically.  */  function handleAsync(obj) {   var onerrorx = obj.onerror;   obj.onerror = onerror;   var onabortx = obj.onabort;   obj.onabort = onabort;   var onloadx = obj.onload;   obj.onload = onload;    /**    * Handle `onerror`.    */    function onerror(error) {     window.onanyerror.call(this, error);     if (onerrorx) return onerrorx.apply(this, arguments);   };    /**    * Handle `onabort`.    */    function onabort(error) {     window.onanyerror.call(this, error);     if (onabortx) return onabortx.apply(this, arguments);   };    /**    * Handle `onload`.    *    * For images, you can get a 403 response error,    * but this isn't triggered as a global on error.    * This sort of standardizes it.    *    * "there is no way to get the HTTP status from a     * request made by an img tag in JavaScript."    * @see http://stackoverflow.com/questions/8108636/how-to-get-http-status-code-of-img-tags/8108646#8108646    */    function onload(request) {     if (request.status && request.status >= 400) {       window.onanyerror.call(this, request);     }     if (onloadx) return onloadx.apply(this, arguments);   } }  /**  * Generic error handler.  *  * This shows the basic implementation,   * which you could override in your app.  */  function onanyerrorx(entity) {   var display = entity;    // ajax request   if (entity instanceof XMLHttpRequest) {     // 400: http://example.com/image.png     display = entity.status + ' ' + entity.responseURL;   } else if (entity instanceof Event) {     // global window events, or image events     var target = entity.currentTarget;     display = target;   } else {     // not sure if there are others   }    capture(entity);   console.log('[onanyerror]', display, entity); }  /**  * Capture stuff for debugging purposes.  *  * Keep them in memory so you can reference them  * in the chrome debugger as `onanyerror0` up to `onanyerror99`.  */  function capture(entity) {   captures.push(entity);   if (captures.length > 100) captures.unshift();    // keep the last ones around   var i = captures.length;   while (--i) {     var x = captures[i];     window['onanyerror' + i] = x;   } }  /**  * Wait til next code execution cycle as fast as possible.  */  function onnext(fn) {   setTimeout(fn, 0); }  })();   

Это можно использовать как это:

 <код> window.onanyerror = function(entity){   console.log('some error', entity); };   

Полный скрипт имеет реализацию по умолчанию, которая пытается распечатать получитаемый «дисплей» версии объекта / ошибки, которую она получает. Может использоваться для вдохновения для обработки ошибок, специфичный приложение. Реализация по умолчанию также сохраняет ссылку на последние 100 объектов ошибок, поэтому вы можете осмотреть их в веб-консоли после того, как они произойдут:

 <код> window.onanyerror0 window.onanyerror1 ... window.onanyerror99   

Примечание. Это работает путем переопределения методов на нескольких браузерах / родных конструкторах. Это может иметь непреднамеренные побочные эффекты. Тем не менее, было полезно использовать во время разработки, чтобы выяснить, где происходит ошибки, чтобы отправить журналы на услуги, такие как NewRelic или Sentry во время разработки, поэтому мы можем измерять ошибки во время разработки, а также на постановку, поэтому мы можем отладить то, что происходит в более глубокий уровень. Затем он может быть выключен в производстве.

Надеюсь, это поможет.

 

It seems that window.onerror doesn't provide access to all possible errors. Specifically it ignores:

  1. <img> loading errors (response >= 400).
  2. <script> loading errors (response >= 400).
  3. global errors if you have many other libraries in your app also manipulating window.onerror in an unknown way (jquery, angular, etc.).
  4. probably many cases I haven't run into after exploring this now (iframes, stack overflow, etc.).

Here is the start of a script that catches many of these errors, so that you may add more robust debugging to your app during development.

(function(){  /**  * Capture error data for debugging in web console.  */  var captures = [];  /**  * Wait until `window.onload`, so any external scripts  * you might load have a chance to set their own error handlers,  * which we don't want to override.  */  window.addEventListener('load', onload);  /**  * Custom global function to standardize   * window.onerror so it works like you'd think.  *  * @see http://www.quirksmode.org/dom/events/error.html  */  window.onanyerror = window.onanyerror || onanyerrorx;  /**  * Hook up all error handlers after window loads.  */  function onload() {   handleGlobal();   handleXMLHttp();   handleImage();   handleScript();   handleEvents(); }  /**  * Handle global window events.  */  function handleGlobal() {   var onerrorx = window.onerror;   window.addEventListener('error', onerror);    function onerror(msg, url, line, col, error) {     window.onanyerror.apply(this, arguments);     if (onerrorx) return onerrorx.apply(null, arguments);   } }  /**  * Handle ajax request errors.  */  function handleXMLHttp() {   var sendx = XMLHttpRequest.prototype.send;   window.XMLHttpRequest.prototype.send = function(){     handleAsync(this);     return sendx.apply(this, arguments);   }; }  /**  * Handle image errors.  */  function handleImage() {   var ImageOriginal = window.Image;   window.Image = ImageOverride;    /**    * New `Image` constructor. Might cause some problems,    * but not sure yet. This is at least a start, and works on chrome.    */    function ImageOverride() {     var img = new ImageOriginal;     onnext(function(){ handleAsync(img); });     return img;   } }  /**  * Handle script errors.  */  function handleScript() {   var HTMLScriptElementOriginal = window.HTMLScriptElement;   window.HTMLScriptElement = HTMLScriptElementOverride;    /**    * New `HTMLScriptElement` constructor.    *    * Allows us to globally override onload.    * Not ideal to override stuff, but it helps with debugging.    */    function HTMLScriptElementOverride() {     var script = new HTMLScriptElement;     onnext(function(){ handleAsync(script); });     return script;   } }  /**  * Handle errors in events.  *  * @see http://stackoverflow.com/questions/951791/javascript-global-error-handling/31750604#31750604  */  function handleEvents() {   var addEventListenerx = window.EventTarget.prototype.addEventListener;   window.EventTarget.prototype.addEventListener = addEventListener;   var removeEventListenerx = window.EventTarget.prototype.removeEventListener;   window.EventTarget.prototype.removeEventListener = removeEventListener;    function addEventListener(event, handler, bubble) {     var handlerx = wrap(handler);     return addEventListenerx.call(this, event, handlerx, bubble);   }    function removeEventListener(event, handler, bubble) {     handler = handler._witherror || handler;     removeEventListenerx.call(this, event, handler, bubble);   }    function wrap(fn) {     fn._witherror = witherror;      function witherror() {       try {         fn.apply(this, arguments);       } catch(e) {         window.onanyerror.apply(this, e);         throw e;       }     }     return fn;   } }  /**  * Handle image/ajax request errors generically.  */  function handleAsync(obj) {   var onerrorx = obj.onerror;   obj.onerror = onerror;   var onabortx = obj.onabort;   obj.onabort = onabort;   var onloadx = obj.onload;   obj.onload = onload;    /**    * Handle `onerror`.    */    function onerror(error) {     window.onanyerror.call(this, error);     if (onerrorx) return onerrorx.apply(this, arguments);   };    /**    * Handle `onabort`.    */    function onabort(error) {     window.onanyerror.call(this, error);     if (onabortx) return onabortx.apply(this, arguments);   };    /**    * Handle `onload`.    *    * For images, you can get a 403 response error,    * but this isn't triggered as a global on error.    * This sort of standardizes it.    *    * "there is no way to get the HTTP status from a     * request made by an img tag in JavaScript."    * @see http://stackoverflow.com/questions/8108636/how-to-get-http-status-code-of-img-tags/8108646#8108646    */    function onload(request) {     if (request.status && request.status >= 400) {       window.onanyerror.call(this, request);     }     if (onloadx) return onloadx.apply(this, arguments);   } }  /**  * Generic error handler.  *  * This shows the basic implementation,   * which you could override in your app.  */  function onanyerrorx(entity) {   var display = entity;    // ajax request   if (entity instanceof XMLHttpRequest) {     // 400: http://example.com/image.png     display = entity.status + ' ' + entity.responseURL;   } else if (entity instanceof Event) {     // global window events, or image events     var target = entity.currentTarget;     display = target;   } else {     // not sure if there are others   }    capture(entity);   console.log('[onanyerror]', display, entity); }  /**  * Capture stuff for debugging purposes.  *  * Keep them in memory so you can reference them  * in the chrome debugger as `onanyerror0` up to `onanyerror99`.  */  function capture(entity) {   captures.push(entity);   if (captures.length > 100) captures.unshift();    // keep the last ones around   var i = captures.length;   while (--i) {     var x = captures[i];     window['onanyerror' + i] = x;   } }  /**  * Wait til next code execution cycle as fast as possible.  */  function onnext(fn) {   setTimeout(fn, 0); }  })(); 

It could be used like this:

window.onanyerror = function(entity){   console.log('some error', entity); }; 

The full script has a default implementation that tries to print out a semi-readable "display" version of the entity/error that it receives. Can be used for inspiration for an app-specific error handler. The default implementation also keeps a reference to the last 100 error entities, so you can inspect them in the web console after they occur like:

window.onanyerror0 window.onanyerror1 ... window.onanyerror99 

Note: This works by overriding methods on several browser/native constructors. This can have unintended side-effects. However, it has been useful to use during development, to figure out where errors are occurring, to send logs to services like NewRelic or Sentry during development so we can measure errors during development, and on staging so we can debug what is going on at a deeper level. It can then be turned off in production.

Hope this helps.

</div
 
 
 
 
6
 
vote
 <код> // display error messages for a page, but never more than 3 errors window.onerror = function(msg, url, line) { if (onerror.num++ < onerror.max) { alert("ERROR: " + msg + " " + url + ":" + line); return true; } } onerror.max = 3; onerror.num = 0;   
 
// display error messages for a page, but never more than 3 errors window.onerror = function(msg, url, line) { if (onerror.num++ < onerror.max) { alert("ERROR: " + msg + " " + url + ":" + line); return true; } } onerror.max = 3; onerror.num = 0; 
</div
 
 
6
 
vote

Один должен сохранить ранее ассоциированный обратный вызов ONError, а также

 <код> <script type="text/javascript">  (function() {     var errorCallback = window.onerror;     window.onerror = function () {         // handle error condition         errorCallback && errorCallback.apply(this, arguments);     }; })();  </script>   
 

One should preserve the previously associated onerror callback as well

<script type="text/javascript">  (function() {     var errorCallback = window.onerror;     window.onerror = function () {         // handle error condition         errorCallback && errorCallback.apply(this, arguments);     }; })();  </script> 
</div
 
 
3
 
vote

Если вы хотите, чтобы единый способ обрабатывать как неопрятные ошибки, так и необработанные обещанные обещания, вы можете посмотреть на неисправно Библиотека .

Редактировать

 <код> <script type="text/javascript" src=".../uncaught/lib/index.js"></script>  <script type="text/javascript">     uncaught.start();     uncaught.addListener(function (error) {         console.log('Uncaught error or rejection: ', error.message);     }); </script>   

Это слушает окно. unandledreuce в дополнение к окну .oneRor.

 

If you want unified way to handle both uncaught errors and unhandled promise rejections you may have a look on uncaught library.

EDIT

<script type="text/javascript" src=".../uncaught/lib/index.js"></script>  <script type="text/javascript">     uncaught.start();     uncaught.addListener(function (error) {         console.log('Uncaught error or rejection: ', error.message);     }); </script> 

It listens window.unhandledrejection in addition to window.onerror.

</div
 
 
   
   
2
 
vote

Я бы порекомендовал дать давать Trackjs PRY.

Это ошибка регистрации в качестве услуги.

Это удивительно просто настроить. Просто добавьте один & lt; скрипт & gt; Строка на каждую страницу, и это. Это также означает, что это будет удивительно просто удалить, если вы решите, что вам это не нравится.

Есть другие услуги, такие как sentry (который является открытым исходным кодом, если вы можете провести свой собственный сервер), но это не делает то, что делает Trackjs. Trackjs записывает взаимодействие пользователя между их браузером и вашим веб-сервером, чтобы вы могли на самом деле отслеживать пользовательские шаги, которые привели к ошибке, в отличие от просто справки файла и номера строки (и, возможно, трассировки стека).

 

I would recommend giving Trackjs a try.

It's error logging as a service.

It's amazingly simple to set up. Just add one <script> line to each page and that's it. This also means it will be amazingly simple to remove if you decide you don't like it.

There are other services like Sentry (which is open-source if you can host your own server), but it doesn't do what Trackjs does. Trackjs records the user's interaction between their browser and your webserver so that you can actually trace the user steps that led to the error, as opposed to just a file and line number reference (and maybe stack trace).

</div
 
 
       
       
1
 
vote

Вы слушаете событие OneRror, назначив функцию Window.OneRror:

 <код> <img>0  
 

You listen to the onerror event by assigning a function to window.onerror:

 window.onerror = function (msg, url, lineNo, columnNo, error) {         var string = msg.toLowerCase();         var substring = "script error";         if (string.indexOf(substring) > -1){             alert('Script Error: See Browser Console for Detail');         } else {             alert(msg, url, lineNo, columnNo, error);         }          return false;    }; 
</div
 
 

Связанный проблема

0  Кнопка CKeditor 4 Не отображается  ( Ckeditor 4 underline button not showing ) 
Это мой код JavaScript для конфигурации моего CKEDITOR. Я нахожу на браузере для этого решения, но я не могу найти никакого решения даже на официальном сайте ...

1  JavaScript не работает над динамическим контентом  ( Javascript not working on dynamic content ) 
У меня есть страница, где в HTML Div загружен с другой страницы. На родительской странице у меня есть JavaScript, который имеет элементы, которые применяются ...

59  Дисплей Div в положении курсора в Textarea [дубликат]  ( Display div at cursor position in textarea ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

1  Столбец Tabulator с JSX - выполнение функций класса  ( Tabulator column with jsx executing class functions ) 
Я пытаюсь использовать React-Tabulator, но у меня проблемы с рендером функции внутри моих столбцов таблицы. Функция возвращает JSX, но она использует другие к...

1  Форма подписки Rapidmail перенаправляет после подписки электронной почты - MailChimp  ( Rapidmail subscription form redirect after email subscription mailchimp ) 
Я создаю веб-страницу, которая включает в себя очень простую форму подписки, в основном собирая адреса электронной почты, заинтересованные в продукте. Для это...

0  Сортировка не работает в смарт-таблице угловой JS  ( Sorting is not working in smart table angular js ) 
Сортировка смарт-таблицы не работает по какой-то причине после использования в качестве пользовательской директивы. Можете ли вы помочь мне, что я сделал не т...

0  JavaScript Foreach Array Ключевые значения, вывод в HTML  ( Javascript foreach array key values output to html ) 
Как сердите к клавишам ARRAY THRU, чтобы вывести свои значения в HTML? Расположение Я работаю, - это миниатюрная сетка, 3 колонны на 2 ряда. Каждый миниатюр...

0  Отображать имя страницы в JavaScript?  ( Display page name in javascript ) 
Как бы я добавил <код> location.href.split('/').pop() к документу HTML для отображения имени страницы? (Не весь URL) я хотел бы отобразить только имя страниц...

4  Является ли хорошей идеей использовать условные зависимости в модулях AMD?  ( Is it a good idea to use conditional dependencies in amd modules ) 
Я думаю об использовании условий для указания модуля зависит в модульной системе AMD. Например, чтобы загрузить библиотеку на браузере и библиотеку на сервере...

0  .append () элемент с более чем одним классом  ( Append element with more than one class ) 
Я не могу найти информацию о том, можно ли использовать .append (), чтобы добавить элемент в HTML и дать этому элементу более одного класса <код> $( ".nav"...

0  JavaScript Ball Collision  ( Javascript ball collision ) 
Я пытаюсь создать простую игру JavaScript с простыми физиками. Я могу определить, когда 2 шарика столкнулись, но у меня возникли проблемы с обработкой столкно...

0  Модель только показывает идентификатор в вложенной модели в парусах  ( Model only show id in nested model in sails ) 
Так что я разрабатываю приложение, используя парус JS. Я хочу отправить нить вместе с его комментариями как ответ. Вот моя модель thread.js <код> module...

0  Как закрыть всплывающее окно, когда видео YouTube играет на кнопке кнопки ESC?  ( How to close popup when youtube video is playing on esc button button ) 
Нажмите меня, чтобы увидеть демонстрацию Когда видео не играет, то кнопка ESC нажала всплывающее окно, но он не работает при воспроизведении видео. ...

0  Новое развитие приложений с использованием Cordova и Ionic  ( Native app development using cordova and ionic ) 
Как сохранить процесс или сервис всегда запущены даже после того, как приложение будет убито пользователем, похожее на секундомер, который будет запущен даже ...

0  Команда STEART BOBLE не работает, когда добавляю новый файл JS  ( Stencil bundle command is not working when i add new js file ) 
Я добавил несколько файлов JS в моей теме (Track-CLI), а когда я запускаю stencil bundle COMMENT, ошибки JS получили бросок. Я пробовал удаление <код> app...

Связанный проблема

0  Кнопка CKeditor 4 Не отображается 
1  JavaScript не работает над динамическим контентом 
59  Дисплей Div в положении курсора в Textarea [дубликат] 
1  Столбец Tabulator с JSX - выполнение функций класса 
1  Форма подписки Rapidmail перенаправляет после подписки электронной почты - MailChimp 
0  Сортировка не работает в смарт-таблице угловой JS 
0  JavaScript Foreach Array Ключевые значения, вывод в HTML 
0  Отображать имя страницы в JavaScript? 
4  Является ли хорошей идеей использовать условные зависимости в модулях AMD? 
0  .append () элемент с более чем одним классом 
0  JavaScript Ball Collision 
0  Модель только показывает идентификатор в вложенной модели в парусах 
0  Как закрыть всплывающее окно, когда видео YouTube играет на кнопке кнопки ESC? 
0  Новое развитие приложений с использованием Cordova и Ionic 
0  Команда STEART BOBLE не работает, когда добавляю новый файл JS