JavaScript のトライ/キャッチ:エラーまたは例外?
-
24-09-2019 - |
質問
わかりました。ここで話が分かれているかもしれませんが、コードに一貫性がないので、一貫性を持たせたいと考えています。しかし、その前に、自分が正しい道を進んでいることを確認したいと思います。実際にはこれは問題ではありませんが、しばらく気になっていたので同僚に聞いてみようと思いました...
を使用するたびに、 try... catch
ステートメントの catch ブロックでは、常にメッセージを内部コンソールに記録します。ただし、ログメッセージには一貫性がありません。それらは次のようなものです。
catch(err) {
DFTools.console.log("someMethod caught an error: ",err.message);
...
または:
catch(ex) {
DFTools.console.log("someMethod caught an exception: ",ex.message);
...
明らかに、どちらの方法でもコードは適切に機能しますが、私が時々「エラー」と呼んだり、時々「例外」と呼んだりすることが気になり始めています。さっきも言ったように、髪を分けているのかもしれないけど、どっちが髪を分けているんだろう。 ちゃんとした 用語?「例外」ですか、それとも「エラー」ですか?
解決
このビット主観的である、誰かや何かが間違っている、不適切な、または無効な何かをするとき、私には誤差があります。これは、構文エラー、論理エラー、読み取りエラー、ユーザエラー、あるいは社会的な誤りである可能性があります。それは抽象的な概念です。
は例外が、一方、特定の条件がコードで発生したときに作成され、スローされるオブジェクトです。それ月または概念的なエラーに対応していなくてもよいです。だから、私には、適切な命名法は「例外」です。
他のヒント
はECMAScript仕様のそれらの例外を呼び出します。あなたは同様に行いたいかもしれません。
あなたのロギングがより有益にするためにます:
catch(ex) {
DFTools.console.log("someMethod caught an exception of type "
+ ex.name + ": ", ex.message);
また、例外(残念ながら)は、任意のタイプとすることができる、と必ずしもそうname
とmessage
性質を持っていないことに留意することがあります
catch(ex) {
if (ex.message && ex.name) {
DFTools.console.log("someMethod caught an exception of type "
+ ex.name + ": ", ex.message);
} else /* deal with it somehow */
これはどこでも繰り返してかなり面倒を見始めているとして、あなたが機能でそれをキャプチャしたい場合があります:
function logExceptions(methodName, action) {
try {
action();
} catch (ex) {
if (ex.message && ex.name) {
DFTools.console.log("someMethod caught an exception of type "
+ ex.name + ": ", ex.message);
} else {
DFTools.console.log("someMethod caught a poorly-typed exception: " + ex);
}
}
}
今、あなたが言うことができます:
logExceptions(function() {
// do some risky stuff...
});
ではJavaScriptそれがキャッチエラーと呼ばれています。あなたは、エラーの代わりに、例外を使用することをお勧め私はそう。 「e」を使用することにより途中で選択肢を残します。 Mozillaの例のように。 MozillaのコアJavaScript 1.5リファレンスの
例外とは、たとえばファイルを開こうとしたときに「ファイルが見つからない例外」が発生する可能性があることが予想されるものです。一方、スタック オーバー フローやメモリ不足など、目に見えないエラーも発生します。
例外は、論理的な結果を生成しない関数から抜け出す代替の論理的な方法です。例外により、なぜこのように存在するのか、何が起こったのかをよりよく説明することもできます。ファイルを開く場合も、ファイル ハンドルは論理的な結果であり、ファイルが存在しない場合 (考えられる例外の 1 つ)、またはファイルがファイルではなくフォルダーである場合 (考えられる別の例外) です。
のMAJOR免責事項:の私はこれまで、「右」の答えがあることを考慮していません。ここでの見解は主観的で個人的です。何よりますと、あなたはダニエルエリカーの有益な答えは1のようなシステムを使用して可能性があるため、あなたが...違う、エヘン、障害を持つ別の事をやろうとしている場合、私は支持するのに約だアイデアが唯一有用であることです。それを念頭に置いてます:
私は「例外は例外的である」と主張しています。 ERRORはそれほど予想外のことである。
免責事項:次の擬似コードは良くありません。それは単に私のポイントを説明するために私は考えることができ、最小の場合となってます。
のノート:それは指定されたファイルを見つけることができない場合は、のこの思考実験では、GETFILEは未定義を返します。
。function AlwaysGetFile(name){
var file = null;
if(FileExists(name)){
file = GetFile(name);
if(typeof file === "undefined"){
throw new "couldn't retrieve file" EXCEPTION
}
}
else{
throw new "file does not exist" ERROR
}
return file;
}
消費者が存在しないファイル名でGetFileOrThrowを呼び出す場合には、エラーが発生します。私の心に区別がより高いレベルのコード(またはユーザー入力が)何かを間違ってやっていることは本当にある...この関数は、この結果について何をすべきかを決定することができ、より高いレベルのコードにラインアップERRORを渡す必要があります。このようにそれを考えてみましょう...この機能は、任意のかかる機能に言って、次のようになります。
ルック、私の友人は、私はここで何が起こっているか知っている:それは要求BobAccounts.xmlするとエラーになりますので、再びそれをしません!ああ、あなたは今、(私を虐待した)ゴーン間違っを持って先に行くと、そこから回復しよう!かもしれないものを知っていると思う場合は、
さて、この関数は、名前を取り、ファイルが存在していることを確認した後、何らかの理由でそれを取得するために失敗した場合を考えます。これは、異なる状況です。本当に予期しない何かが起こっています。しかも、かかるコードののせいにするのではありません。今、私たちは本当にこの機能は、任意のかかる機能に言いたい:
fiddlesticksああ!申し訳ありませんが、このことについて、私は謙虚にあなたの許しが、私は本当になくなって間違ってい理解していないことEXCEPTIONAL何かを請います。私はBobAccounts.xmlのためのあなたの要求は無理だったとは思わない...と私はあなたのためにそれを果たすべきである知っています。私はあなたよりも低いレベルのコードですので、私は実際に何が起こっているか知っているべき...しかし、私にはありません...あなたはこの例外的な状況を理解するの私よりも少ないチャンスをしたので、私はあなたがおそらくと思います最高のは、ちょうどあなたがやっていることを停止し、このメッセージが先頭にすべての道を手放す...私は意味、何かがあるの真剣が怪しいここで起こっています。
私の要約があるので、私が思うこの:ミスは、より高次のコードで起こった場合には(あなたが悪いデータを渡された)エラーをスロー。ミスが下位コードで起こった場合に間違いが関数で起こった場合に例外を投げる(あなたが理解していなかったとの計画を立てることができなかった方法で、失敗した依存機能)...とあなたが現在書いています。.. 。まあ、当たり前、もしあなたしていることを認識して、それを修正する!
そして、最後に、より直接的に元の質問に答えるために:エラーと例外ハンドリングの面では、私のアドバイスは次のようになります。(必要に応じてそれらをログに記録する)正常すべてのエラーを処理...しかし、慎重に実際にハンドル例外。唯一あなたが本当に確信しているあなたはそれが何であるかを知っていて、それが起こった理由(あなたがしなければならない場合、それを再スロー)、それ以外の場合はバブルアップさせた場合は、例外から回復しようとします。
私は例外としてそれに名前を付けるように、あなたはCatchブロックで取得することは、例外です...
それが誤りである場合 - 私は私のコードでそれを処理することができます&Iは、通常、Catchブロックでそれを見ることを期待しないでください。
HTHます。