エラー・ハンドリング


Errorクラスを継承したもの

JavaScript標準 (例)

Node.js

カスタムエラー

extendsする

class MyError extends Error {
  constructor(...params) {
    super(...params)
    this.name = 'カスタムエラー'
  }
}
throw new MyError('エラー発生')

エラー・ハンドリングしてないとき

uncaughtExceptionイベント発生して終了

デフォルトのリスナー

リスナー登録(上書き)

process.on('uncaughtException', (error, origin) => {
  // originでPromise.reject()かどうか判別できる
  process.exitCode = 2 // 終了ステータス変更
  console.error(error.message)
})
throw new Error('未補足エラー')

同期コードのとき

try{} catch(error){}

try {
  throw new Error(1)
} catch (error) { // プログラム継続処理
  console.log(error.message)
} finally { // 必ず行う処理
  console.log(2)
}
console.log(3)
1
2
3

非同期コードのとき

try{} catch(error){}は機能しない

try {
  setImmediate(() => { // 非同期
    throw new Error('エラー発生')
  })
} catch (error) {
  // エラー補足できず
}

捕捉作法はいろいろ


コールバックの引数1でError受け取り

コールバックの引数1

例: exec('コマンド', コールバック)

const { exec } = require('child_process')
exec('no-such-command', (error, stdout, stderr) => {
  if (error) {
    console.error(`標準エラー出力: ${stderr}`)
    process.exit(error.code) // 127
  }
})
標準エラー出力: /bin/sh: no-such-command: コマンドが見つかりません

errorイベントのリスナー登録


Promisecatch()メソッド

new Promise((resolve, reject) => {
  throw new Error('エラー')
}).catch(error => {
  console.error(error.message)
})
console.log(1) // 先
1
エラー

async関数でawaitした部分は同期

async function 非同期() {
  try {
    await Promise.reject(2) // ここは同期
  } catch (error) {
    console.error(error)
  }
}
非同期()
console.log(1) // 先
1
2

Promise.reject()を捕捉しないとき

非推奨

[DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. \
In the future, \
promise rejections that are not handled will terminate the Node.js process \
with a non-zero exit code.