diff --git a/src/index.js b/src/index.js index cc2d662..df5893c 100644 --- a/src/index.js +++ b/src/index.js @@ -17,16 +17,45 @@ try { } // Error handling +// Force crash on unhandled rejections and uncaught exceptions. +// Use something like forever/pm2 to restart. +const MAX_STACK_TRACE_LINES = 8; + function errorHandler(err) { // Unknown message types (nitro boosting messages at the time) should be safe to ignore if (err && err.message && err.message.startsWith("Unhandled MESSAGE_CREATE type")) { return; } - // For everything else, crash with the error - console.error(err); + if (err) { + if (typeof err === "string") { + console.error(`Error: ${err}`); + } else if (err instanceof utils.BotError) { + // Leave out stack traces for BotErrors (the message has enough info) + console.error(`Error: ${err.message}`); + } else { + // Truncate long stack traces for other errors + const stack = err.stack || ""; + let stackLines = stack.split("\n"); + if (stackLines.length > (MAX_STACK_TRACE_LINES + 2)) { + stackLines = stackLines.slice(0, MAX_STACK_TRACE_LINES); + stackLines.push(` ...stack trace truncated to ${MAX_STACK_TRACE_LINES} lines`); + } + const finalStack = stackLines.join("\n"); + + if (err.code) { + console.error(`Error ${err.code}: ${finalStack}`); + } else { + console.error(`Error: ${finalStack}`); + } + } + } else { + console.error("Unknown error occurred"); + } + process.exit(1); } + process.on("uncaughtException", errorHandler); process.on("unhandledRejection", errorHandler); @@ -48,18 +77,6 @@ const utils = require("./utils"); const main = require("./main"); const knex = require("./knex"); -// Force crash on unhandled rejections (use something like forever/pm2 to restart) -process.on("unhandledRejection", err => { - if (err instanceof utils.BotError || (err && err.code)) { - // We ignore stack traces for BotErrors (the message has enough info) and network errors from Eris (their stack traces are unreadably long) - console.error(`Error: ${err.message}`); - } else { - console.error(err); - } - - process.exit(1); -}); - (async function() { // Make sure the database is up to date const [completed, newMigrations] = await knex.migrate.list();