JavaScript のランタイムエラーは、起こると処理がそこで停止してしまう。たとえば
initModuleA();//エラーが起こる可能性のあるモジュール
initModuleB();
initModuleC();
alert("done");
このコードで initModuleA でエラーが起こると、以降、initModuleB と initModuleC、alert は実行されない。
moduleA が完全に独立していて、障害が致命的でないならば、moduleA を切り離してでも処理を続けさせるのが、フォールトトレラントなシステムと言える。
そこで、try..catch 節を使う。
try {
initModuleA();
} catch(e) {
showError(e);
}
initModuleB();
initModuleC();
alert("done");
これで、alert まで処理が続く。
怠け者の try..catch
HTML ページ A、B、C があるとする。それらのページの共通モジュールもあれば、一部のページでしか使用されないモジュールもあるとする。
そのような状態で、各ページに全モジュールを初期化するコードが書かれている場合、
function initModules() {
try {
initModuleX();
} catch(e) {}
try {
initModuleY();
} catch(e) {}
try {
initModuleY();
} catch(e) {}
}
全ての初期化コードを try..catch 節で囲めば、仮にページ C に moduleX に必要な要素が存在しなくとも、処理は続けられる。
catch するつもりがない try..catch 節のことを、”怠け者の try..catch” と自分は呼んでいる。便利なのでつい書いてしまうが。