现在很难从“野外”发生的错误中获取堆栈跟踪,因为 Error 对象不可用于window.onerror
.
window.onerror = function(message, file, line) { }
还有一个new error event https://stackoverflow.com/questions/12746034/how-to-get-error-event-details-in-firefox-using-addeventlistener,但此事件尚未公开 Error 对象。
window.addEventListener('error', function(errorEvent) { })
Soon, window.onerror
将得到一个第五个参数 https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror包含 Error 对象,您可能可以使用堆栈跟踪.js http://stacktracejs.com/期间抓取堆栈跟踪window.onerror
.
<script src="stacktrace.js"></script>
<script>
window.onerror = function(message, file, line, column, error) {
try {
var trace = printStackTrace({e: error}).join('\n');
var url = 'http://yourserver.com/?jserror=' + encodeURIComponent(trace);
var p = new printStackTrace.implementation();
var xhr = p.createXMLHTTPObject();
xhr.open('GET', url, true);
xhr.send(null);
} catch (e) { }
}
</script>
在某些时候,Error API 可能会被标准化,但就目前而言,每个实现都是不同的,因此使用 stacktracejs 之类的东西来获取堆栈跟踪可能是明智的,因为这样做需要为每个浏览器提供单独的代码路径。