JavaScript/Error
Error オブジェクトは、JavaScript における標準的なエラー処理メカニズムの中心的な役割を果たすオブジェクトです。プログラム実行中に発生するエラーや例外を表現し、デバッグに重要な情報を提供します。
基本的な構造
編集Error オブジェクトは、主に以下のプロパティを持ちます:
- name: エラーの種類を示す文字列(例:「TypeError」「ReferenceError」)
- message: エラーの詳細な説明を提供する文字列
- stack: エラーが発生した呼び出し履歴を含むプロパティ(非標準だが広くサポートされています)
エラーの種類
編集JavaScriptには、いくつかの組み込みエラー型が存在します:
- EvalError
- スクリプトの
eval()
関数に関連するエラーとして定義されていますが、現在のECMAScript仕様では使用されていません。過去のバージョンとの互換性のために存在します。 - RangeError
- 許容範囲外の値が検出された場合にスローされます。例として、数値が期待される範囲を超えた場合が挙げられます。
- ReferenceError
- 無効な参照が検出された場合にスローされます。たとえば、存在しない変数や関数を参照しようとした場合です。
- SyntaxError
- 構文解析エラーが発生した場合にスローされます。例として、無効な構文のJavaScriptコードがあります。
- TypeError
- 特定の操作が失敗し、その原因が他のエラータイプでは適切に表現できない場合にスローされます。たとえば、不正な型の操作が原因です。
- URIError
- グローバルURI操作関数(
encodeURI
やdecodeURI
など)がその定義に反する方法で使用された場合にスローされます。
使用例
編集エラーの生成
編集// 手動でのエラー生成 const customError = new Error('カスタムエラーメッセージ'); // 特定のエラー型の生成 const typeError = new TypeError('型が正しくありません');
エラーのキャッチ
編集try { // エラーが発生する可能性のあるコード throw new Error('エラーが発生しました'); } catch (error) { console.error(error.name); // エラー名 console.error(error.message); // エラーメッセージ console.error(error.stack); // スタックトレース }
カスタムエラー
編集独自のエラークラスを作成することも可能です:
class CustomError extends Error { constructor(message) { super(message); this.name = 'CustomError'; } } try { throw new CustomError('カスタムエラーの例'); } catch (error) { console.log(error instanceof CustomError); // true }
注意点
編集- エラーオブジェクトは、プログラムの異常な状態を示すために使用されます
- エラーハンドリングは、アプリケーションの安定性と信頼性を高めるために重要です
- 可能な限り具体的なエラー情報を提供し、適切に処理することが推奨されます
静的プロパティ
編集Errorオブジェクトには、以下のような静的プロパティがあります。
Error.captureStackTrace()
編集Error.captureStackTrace(targetObject[, constructorOpt])
は、スタックトレース情報をエラーオブジェクトに手動で追加するための静的メソッドです。
V8独自のメソッドです。
class CustomError extends Error { constructor(message) { super(message); Error.captureStackTrace(this, CustomError); } } const error = new CustomError("Custom error occurred"); console.log(error.stack);
- 引数
-
targetObject
: スタックトレースをキャプチャするオブジェクト。constructorOpt
: スタックトレースの開始点を指定する関数。
Error.length
編集Error.length
は、Error
コンストラクタが受け取る引数の数を表します。
通常、この値は1
です。
console.log(Error.length); // => 1
Error.name
編集Error.name
は、エラーの名前を表します。デフォルトでは"Error"
ですが、カスタムエラークラスで変更可能です。
class CustomError extends Error { constructor(message) { super(message); this.name = "CustomError"; } } const error = new CustomError("Something went wrong"); console.log(error.name); // => "CustomError"
Error.prototype
編集Error.prototype
は、Error
オブジェクトのプロトタイプを表します。
このプロトタイプには、toString()
やstack
プロパティなどが含まれています。
const error = new Error("Example error"); console.log(Object.getPrototypeOf(error) === Error.prototype); // => true
Error.stackTraceLimit
編集Error.stackTraceLimit
は、スタックトレースに含まれるフレーム数の上限を設定するプロパティです。
デフォルト値は10
ですが、必要に応じて変更できます。
Error.stackTraceLimit = 20; const error = new Error("Deep stack trace example"); console.log(error.stack); // 最大20フレームのスタックトレースが表示されます
注意点
編集Error.captureStackTrace
はV8独自のメソッド。ChromeとEdge以外のブラウザ環境では利用できない場合があります。- プロパティの値を変更する際は、グローバルなエラー挙動に影響を与える可能性があるため注意が必要です。
インスタンスプロパティ
編集Errorオブジェクトには、以下のようなインスタンスプロパティがあります。
Error.prototype.constructor()
編集Error.prototype.constructor
は、エラーオブジェクトのコンストラクタを指します。
デフォルトでは、Error
コンストラクタを参照しますが、カスタムエラーの場合には変更されることがあります。
const error = new Error("Sample error"); console.log(error.constructor === Error); // => true
Error.prototype.message
編集Error.prototype.message
は、エラーに関連付けられたメッセージを格納する文字列プロパティです。
コンストラクタに渡されたメッセージがこのプロパティに設定されます。
const error = new Error("An error occurred"); console.log(error.message); // => "An error occurred"
- デフォルト値は空文字列(
""
)です。
Error.prototype.name
編集Error.prototype.name
は、エラーの名前を表します。
デフォルトでは"Error"
ですが、カスタムエラーで上書きできます。
class CustomError extends Error { constructor(message) { super(message); this.name = "CustomError"; } } const error = new CustomError("Custom error message"); console.log(error.name); // => "CustomError"
Error.prototype.toString()
編集Error.prototype.toString()
は、エラーオブジェクトを文字列に変換するメソッドです。
通常、エラーのname
とmessage
を組み合わせた形式で出力されます。
const error = new Error("An error occurred"); console.log(error.toString()); // => "Error: An error occurred"
toString()
をカスタマイズすることで、エラーオブジェクトの出力を変更することも可能です。
class CustomError extends Error { constructor(message) { super(message); this.name = "CustomError"; } toString() { return <code>${this.name}: [${this.message}]</code>; } } const error = new CustomError("Something went wrong"); console.log(error.toString()); // => "CustomError: [Something went wrong]"