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" と自分は呼んでいる。便利なのでつい書いてしまうが。