きり丸の技術日記

技術検証したり、資格等をここに残していきます。

JavaScript, GAS, TypeScriptで自作例外を作成する

GASを使用していて、雑にエラーハンドリングしたい時に自作例外をthrowして、ハンドリングしたいと思いました。

今回の記事は、JavaScript・GAS・TypeScriptで自作例外を作成します。

環境

コード

自作例外を定義する

Errorクラスを継承することで、自作例外を作成できます。

class ValidateError extends Error {
  constructor(...params){
    super(...params);
    this.name = "ValidateError";

    // ES6(ES2015)のスタックトレースの保持
    if (Error.captureStackTrace) {
      Error.captureStackTrace(this, this.constructor);
    }
    // ES5以前のスタックトレースの保持
    Object.setPrototypeOf(this, new.target.prototype);
  }
}

自作例外をハンドリングする

例外はinstanceOfでハンドリングできます。例外設計にも寄りますが、HttpStatusごとの自作例外、ログレベルごとの自作例外等を作っておくとおもしろいです。

function main() {
  try {
    // throw new Error("普通のエラー");
    throw new ValidateError("バリデーションエラー");
  } catch(e){
    if (e instanceof ValidateError){
      console.warn(e.name + ': ' + e.message)
      return;
    } else {
      console.error("予期せぬエラーが発生しました");
      raise;
    }
  }
}

Error以外にデフォルトで定義している例外

JavaScriptではデフォルトで定義されている例外があります。自作例外が不要であればこちらの例外を流用してもよいです(そんなケースはないでしょうが…)

なお、TypeScriptだとコンパイルをする必要があるので、SyntaxError等は実行中には発生しないでしょう。

デフォルトで定義されている例外に関してはMDN Web Docs様のページを引用させていただきます。

  • EvalError
    • グローバル関数eval() に関して発生するエラーを表すインスタンスを生成します。
  • InternalError
    • "too much recursion"(深すぎる再帰)など、JavaScriptエンジンで内部エラーが発生した時に発生するエラーを表すインスタンスを生成します。
  • RangeError
    • 数値変数または引数が、その有効範囲外である場合に発生するエラーを表すインスタンスを生成します。
  • ReferenceError
    • 不正な参照から参照先の値を取得した時に発生するエラーを表すインスタンスを生成します。
  • SyntaxError
    • 構文エラーを表すインスタンスを生成します。
  • TypeError
    • 変数または引数の型が有効でない場合に発生するエラーを表すインスタンスを生成します。
  • URIError
    • encodeURI() またはdecodeURI() に不正な引数が渡された時に発生するエラーを表すインスタンスを生成します。

終わりに

Javaだと実行時例外であるRuntimeExceptionがあり、普段はRuntimeExceptionを多用しています。JavaScriptでも明示的な実行時例外がデフォルトで用意されているかと思いましたが、当然のようにありませんでしたね。

自作例外を使用するユースケースは多いので、次回以降のGASを含めたツールではこの自作例外を使いつつ、プロダクトコード自体での表現を減らしていきたいです。


この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。


自分向け検索キーワード:ユーザー定義例外、自作例外、カスタム例外、独自例外。

※ 自作シリーズは検索キーワードが非常に揺れるので、どれかに引っかるようにします。

参考情報