JS では、関数に渡された引数が実際に 'error' 型なのか、それとも Error のインスタンスなのかを確認することはできないようです。
たとえば、これは無効です:
typeof err === 'error'
可能な型は 6 つだけ (文字列形式) であるため:
typeof 演算子は、型情報を文字列として返します。typeof
返される値は 6 つあります。
「数値」、「文字列」、「ブール値」、「オブジェクト」、「関数」、および「未定義」。
しかし、次のような単純なユースケースの場合はどうなるでしょうか。
function errorHandler(err) {
if (typeof err === 'error') {
throw err;
}
else {
console.error('Unexpectedly, no error was passed to error handler. But here is the message:',err);
}
}
では、引数が Error のインスタンスであるかどうかを判断する最良の方法は何でしょうか?
instanceof
オペレーターは何かお手伝いできますか?
ベストアンサー1
あなたはinstanceof
演算子 (ただし、以下の注意事項を参照してください)。
var myError = new Error('foo');
myError instanceof Error // true
var myString = "Whatever";
myString instanceof Error // false
チェックが行われている場所とは異なるウィンドウ/フレーム/iframe でエラーがスローされた場合、上記は機能しません。その場合、チェックはオブジェクトinstanceof Error
に対しても false を返しますError
。その場合、最も簡単な方法はダックタイピングです。
if (myError && myError.stack && myError.message) {
// it's an error, probably
}
stack
ただし、プロパティを含むエラーのないオブジェクトがある場合、ダックタイピングによって誤検知が発生する可能性がありますmessage
。