GASを使用していて、雑にエラーハンドリングしたい時に自作例外をthrowして、ハンドリングしたいと思いました。
今回の記事は、JavaScript・GAS・TypeScriptで自作例外を作成します。
環境
- GAS
- 2022/01/27
- TypeScript
- 4.4.2
- CodeSandboxで検証
コード
自作例外を定義する
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でのシェアや、今後も情報発信しますのでフォローよろしくお願いします。
自分向け検索キーワード:ユーザー定義例外、自作例外、カスタム例外、独自例外。
※ 自作シリーズは検索キーワードが非常に揺れるので、どれかに引っかるようにします。