generated at
JavaScriptのstacktraceが出てるエラーを全て潰す

Auto Project Backupの運用前にやった事

herokuは、webのプロセスがstatus 500を返したり、レスポンスに時間がかかったりするとエラーを出してくれる
HTTP status codeだけでなく、Heroku Error Codeも発行される
これの監視はしっかりできている
Logentriesがいい感じにやってくれる
batch処理はwebのプロセスではない
HTTP status codeもHeroku Error Codeも出ない
標準出力やエラー出力を見てなんとかしなければならない
あらためて色々logを見直した
実際はエラーではないが、エラーのように見える出力がある事がわかった
滅茶苦茶まぎらわしいのでどうにかしたい
まぎらわしい
修正すべき重大なエラー
例外処理の成功報告
どちらもこうハンドリングしていた
js
try { 何か処理 } catch (err) { console.error(err.stack || err) }

JavaScriptstacktraceが出てるエラーを全て潰す
単純なルール
1. ソースコードを修正すべき重大なエラーはstacktraceを必ず出力する
2. ソースコードを修正する必要がない例外処理の成功は、stacktraceを出さない
例:不正なリクエスト拒否に成功した場合など
3. Logentriesでstacktraceを全て捕捉し、Slack #scrapbox-alert に流す
stacktraceにマッチするLogentries alert
/[^\s]+\.js:\d+:\d+\)?$/
console.error(err.stack) で出る、全パターンにマッチする
2週間ぐらい、slackに無限にstacktraceが流れ続けて発狂しかけた

ソースコードを修正すべき重大なエラーと、例外処理の成功報告を分ける
例外処理したらstacktrace出力せず、clientにresponseを返すだけにする
js
import MongooseValidationError from 'mongoose/lib/error/validation' router.get('/foo/bar', (req, res, next) => { try { 何か処理 } catch (err) { if (err instanceof MongooseValidationError) { // DBのvalidation error return res.status(400).error('bad request') } // 以下、不明なエラーのハンドリング console.error(err.stack || err) res.status(500).error('何が起きたかよくわからないエラーなので修正の必要がある') } })