Create a gist now

Instantly share code, notes, and snippets.

Sending JS errors to server
function sendError(message, url, lineNum) {
var i;
// First check the URL and line number of the error
url = url || window.location.href;
lineNum = lineNum || 'None';
// If the error is from these 3rd party script URLs, we ignore
// We could also just ignore errors from all scripts that aren't our own
var scriptURLs = [
// Facebook flakiness
'https://graph.facebook.com',
// Facebook blocked
'http://connect.facebook.net/en_US/all.js',
// Woopra flakiness
'http://eatdifferent.com.woopra-ns.com',
'http://static.woopra.com/js/woopra.js',
// Chrome extensions
'extensions/',
// Other (from plugins)
'http://127.0.0.1:4001/isrunning', // Cacaoweb
'http://webappstoolbarba.texthelp.com/',
'http://metrics.itunes.apple.com.edgesuite.net/'
];
for (i = 0; i < scriptURLs.length; i++) {
if (url.indexOf(scriptURLs[i]) === 0) {
return false;
}
}
// Now figure out the actual error message
// If it's an event, as triggered in several browsers
if (message.target && message.type) {
message = message.type;
}
if (!message.indexOf) {
message = 'Non-string, non-event error: ' + (typeof message);
}
// If the error matches these, ignore.
var errorsToIgnore = [
// Random plugins/extensions
'top.GLOBALS',
'originalCreateNotification', // See: http://blog.errorception.com/2012/03/tale-of-unfindable-js-error.html
'canvas.contentDocument',
'MyApp_RemoveAllHighlights',
'http://tt.epicplay.com',
'Can\'t find variable: ZiteReader',
'jigsaw is not defined',
'ComboSearch is not defined',
'http://loading.retry.widdit.com/',
'atomicFindClose',
// Facebook borked
'fb_xd_fragment',
// Probably comes from extensions: http://stackoverflow.com/questions/5913978/cryptic-script-error-reported-in-javascript-in-chrome-and-firefox
'Script error.'
];
for (i = 0; i < errorsToIgnore.length; i++) {
if (message.indexOf(errorsToIgnore[i]) > -1) {
return false;
}
}
// Otherwise, send the error and relevant information
var error = 'JS Error: ' + message + ' URL: ' + url + ' Line: ' + lineNum;
error += '\n Document URL: ' + document.URL;
if (window.UserAgent) {
var userAgent = new UserAgent();
error += '\n Browser: ' + userAgent.browser_name + ' ' + userAgent.browser_version + ' | OS: ' + userAgent.os + ' | Platform: ' + userAgent.platform;
}
if (window.printStackTrace) {
try {
error += '\n Stacktrace: ' + printStackTrace().slice(4).join('\n -');
} catch(e) {}
}
if (window.ED.CURRENT_USER) error += '\n User: ' + ED.CURRENT_USER.email + ' http://' + window.location.host + '/user/' + ED.CURRENT_USER.id;
ED.shared.sendData('log-error', 'error=' + error, function() {});
return false;
}
@rakeshpai

Pamela,

The originalCreateNotification error isn't from Twitter, but from a Chrome extension. Details here.

@toddhgardner

Thanks for compiling these Pamela! We used this listing in some of our guidance on ignoring errors in TrackJS

@rossettistone

Nice! Just hit atomicFindClose for the first time today.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment