Try/Catch をサポートする他の言語では、開発者は JavaScript よりもその機能をより多く利用しているようです。これには理由がありますか?Try/Catch の JS 実装には欠陥がありますか?
5 に答える
この記事を見てみてください: http://dev.opera.com/articles/view/effective-javascript/?page=2#trycatch
上記のリンクから:
try-catch-finally コンストラクトはかなりユニークです。他のコンストラクトとは異なり、実行時に現在のスコープに新しい変数を作成します。これは、catch 句が実行されるたびに発生し、キャッチされた例外オブジェクトが変数に割り当てられます。この変数は、同じスコープ内であっても、スクリプトの他の部分には存在しません。これは catch 句の開始時に作成され、終了時に破棄されます。
この変数は実行時に作成および破棄され、言語の特殊なケースを表しているため、一部のブラウザーではこれを効率的に処理できず、パフォーマンスが重要なループ内に catch ハンドラーを配置すると、例外がキャッチされたときにパフォーマンスの問題が発生する可能性があります。
ここで同様の質問を表示することもできます
アップデート
https://github.com/petkaantonov/bluebird/wiki/Optimization-killersへのリンクを追加します。これには、V8 に関する有用な情報と、V8 がこれら (および同様の) 構造を処理する方法が含まれているためです。
特に:
現在最適化できません:
- ジェネレーター関数
- for-of ステートメントを含む関数
- try-catch ステートメントを含む関数
- try-finally ステートメントを含む関数
- 複合 let 代入を含む関数
- 複合 const 代入を含む関数
- proto、または get または set 宣言を含むオブジェクト リテラルを含む関数。
最適化できない可能性が高い:
- debugger ステートメントを含む関数
- 文字通り eval() を呼び出す関数
- with ステートメントを含む関数
いいえ、欠陥はありませんが、同期コードの場合、通常、不格好なコードを使用するよりも、独自のコードでチェックする方が簡単でクリーンtry{}catch(e){}
です。
例:
var container = document.getElementById("timmy");
container.innerHTML = "I'm timmy!";
IDが「timmy」である要素がない場合は、次のように処理できます。
try
{
container.innerHTML = "I'm timmy";
}
catch (error)
{
//handle no container
}
また:
if(container) container.innerHTML = "I'm timmy";
else //handle no container
もう1つ覚えておくべきことは、JavaScriptアプリケーションはイベント駆動型であり、プログラムの主要部分にあるtry / catchブロックは、イベントコールバックで発生するエラーをキャッチできないことです。
例:
sqlConnection.query("SELECT * FROM table",
function(){console.log("queried!");});
これにより、プログラムの続行中に実行されるネイティブコードがトリガーされます。エラーが発生した場合、プログラムがこの行までバックトラックすることを期待できないため、エラーハンドラーがその処理を実行できます。代わりに、コールバック自体でエラーを処理します。最初のパラメータとして渡すことによって発生したエラーをコールバックに提供するのが一般的な方法です。
sqlConnection.query("SELECT * FROM table",
function(error, data){
if(error) console.log("query failed");
else console.log("queried!");
});
または、コードがコールバックで失敗した場合は、上記の方法で処理できます。
link.onclick = function(e)
{
var popUp = document.getElementById("popup");
if(!popUp)
return true; //follow link if no pop-up exists
popUp.style.display = "block";
};
ほとんどの JavaScript コードの非同期性により、低レベルで try/catch が隠され、エラー コールバックが呼び出されます。
js の最も重いコードは非同期で、コールバックまたは promise パターンを使用します。もう 1 つのコードは単純で、try/catch を必要としません。
js ライブラリを掘り下げると (お気に入りを選択してください)、最新の js アプリケーションで実行される重いアプリ コードの多くをラップする try/catch ブロックが見つかります。次に、これらのライブラリは、多くの js コード サンプルで見られるエラーまたは失敗のコールバックを呼び出します。
ifステートメントとは対照的に、try / catchの方がオーバーヘッドが大きいと思いますが、例外が実際にスローされた場合にのみ問題になると思います。私はtry/catchsを頻繁に使用しますが、例外がスローされる可能性が高いことがわかっている場合に限ります。
効率的に使用すれば、try/catchを使用しない理由は実際にはありません。
JavaScript はそれらをあまり必要としません。その理由は、1 つのエラーでスクリプト全体が停止するわけではないため、エラーをキャッチする理由がほとんどないからです。Javascript はイベント ドリブンであり、ほとんどの関数は特定のイベントが発生したときに実行され、クライアント側であるため、何か問題が発生した場合はエラーが発生し、エラーをキャッチして処理することはほとんど役に立ちません。私見だけ。