try、catchとは 例外処理

CSSやHTML、そしてJavaScriptについてリファレンス的に扱ってみたいと思います。もちろん実践的なものも。
try、catchとは 例外処理

try、catchとは 例外処理

水曜日, 8, 23, 2006

line line

別に書くことがないってわけではないんですけれど、今作成しているとあるWebアプリに熱中していて、アクセス数やブログどころではない。(笑
開発画面
これが今作成しているAjaxを使用した、ちょっとCOOL(?)なWEBアプリの開発画面。
一応、今回は配布も考えているので、インストール用プログラムを作って実行させているところ。
Ajaxに触れて本日で約10日程。
にもかかわらず、久々の大がかりなWebアプリを作らせてしまうほど私を熱中させてくれた。
が、実際はAjaxの部分は、ほんの10%ほど。
残りの開発のほとんどが、JavaScriptとPHP、そしてデバッグ。
私はもともとJavaScriptはそれほど覚えるつもりではなかったのですけれど、タイピングタイピング練習サイト、そして壁紙作成ツールと作ってきて、無意識的にJavaScriptの知識がついてきているような気がする。

try catch とは

XMLHttpRequestの下の方のソースをよーく眺めてみると、

    // IE6用
try{
xmlHttpObj = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
// IE5用
try {
xmlHttpObj = new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){
return null;
}
}

のような記述がありますが、はて、この「try」とか「catch」とかってなんだろう?

PHPやPerlプログラマー、そして初心者JavaScriptプログラマーであれば、このわけのわからぬ制御(?)用の記述に戸惑うはず。
私の場合、これを初めて目にしたのはJAVAを学んだ時でしたが、私も「はて、tryってなんだろ・・・」状態でした。

例外処理

PHPでも、この「try」はでてきます。
というより、オブジェクト指向で記述できる言語にはたいてい用意されているようです。
で、この「try」「catch」で囲むことを「例外処理」といいます。

例外処理ってなんぞや?
簡単にいってしまえば、「if文」に似たもの・・・です。
以下をみてください。

try {
//ここでファイルからデータを読み込む処理を記述したとする
}catch(e){
//ここでうまくファイルからデータを読み込めなかった時に実行したい
//処理を記述しておく

}

ある程度本格的なWEBアプリを作ってきた人であれば、PHPもしくはCGI等でファイルからデータを読み込むような処理をしたことがあると思います。
んで、これらの言語の入門書は必ずファイルが読み込めなかった時のための処理方法も説明してあるはずです。
実際自鯖なんか運営しているとわかるんですけれど、結構ファイルの読み込みに失敗する時がでてきます。
たとえば、
1.パーミッション設定が間違っていた時。
2.ファイルパスが間違っていた時。
3.HDDがいっぱいだったりといった物理的なエラー時。
なので、たいていPHPなんかでファイルを読み込む時は、

if (FALSE == ($fp = @FOpen($file , "r"))){
print "ファイルのオープンに失敗"; exit(1);
}

というような「if文」を記述するはずです。
で、これを「try」そして「catch」を使って記述すると・・・

try {
$fp = @FOpen($file , "r");
}catch($e){
print "ファイルのオープンに失敗"; exit(1);
}

みたいになるわけです。
「catch」の引数「$e」ですが、ここにどんなエラーか・・・というのが入っています。
実際にPHPで「try{...}catch( ){...}」を使う時は、こういう使い方じゃないんですけれど、意味としてはこんな感じ。

んで、JAVAなんかは、ほぼ完全な(?)オブジェクト指向な言語なのと、例外処理に関して徹底化されているんで、エラーが起こりそうなメソッド(JAVAでは関数のことをメソッドと言う)を使う場合は、例外処理を記述していないとコンパイルする時に怒られます。
なので、JAVAの場合、ちょっと実験的に簡単なプログラムを書いてもすごく長くなってしまう。というデメリットがあるんですけれど、この例外処理の徹底化によって思わぬ誤動作やミスが防げるわけです。
大規模なアプリケーション開発にもなってくると、ついついこれはあとでやるか・・・なんていうようなことが多発してきますが、JAVAの場合、ちょっとでも気を抜いて作ったりすると怒られるわけです。

ただし、PHPのような非常にやさしい(寛大な(?))言語の場合、例外処理ははっきりいって使っても使わなくてもあまり意味がありません。
なぜなら先に言ったように「if文」で代用できてしまうから。また、例外処理をしなくても怒られないから。
なので、PHPでオブジェクトバリバリで開発している人も、あんまりこの「try...catch...」は使わないんじゃないかな。と。

JavaScriptにおいてのtry...catch...

ところが、JavaScriptで動的なコンテンツを作っている場合は、この「try...catch...」は非常に便利。
どんなときに使うって?

// 1から10までのランダムな整数を取得
var max = Math.floor(Math.random() * 10);
var obj = null;
for(var i = 0; i < max; i++){
obj = document.getElementById("window" + i);
// 背景を黒で塗りつぶす
obj.style.backgroundColor = "#000000";
}

この場合、
<div id="window0">No.0</div>
というタグで囲まれた部分の背景を黒く塗りつぶすことになるわけですが、もし「max = 8」の時に、
<div id="window7">No.7</div>
が無かった場合・・・。
そう、エラーになります。
これを「if」で回避すると、
if (!document.getElementById("window" + i)){
 alert("window" + i + "が見つかりません!!!");
}
なんて記述になると思います。が・・・
これでもエラーになります。
そもそも「存在しないもの」を「存在するか確認しようとした時点」でエラーになります。
実際には、
obj = document.getElementById("window" + i);
が、いけないのではなくて、次の
obj.style.backgroundColor = "#000000";
がいけないんですけれど、こういったエラーを防ぐには以下のようにします。

// 1から10までのランダムな整数を取得
var max = Math.floor(Math.random() * 10);
var obj = null;
for(var i = 0; i < max; i++){
obj = document.getElementById("window" + i);
// 背景を黒で塗りつぶす
try {
obj.style.backgroundColor = "#000000";
}catch(e){
// ない場合はループを抜ける
break;
}
}

今までJavaScriptで原因不明のエラーがでて困った。なんていう経験がある方。
ぜひこの「try...catch...」を使ってみてください。
JAVAやPHPの例外処理は、もっと複雑なんですけれどJavaScriptの場合、上のように簡単な記述で採り入れることが出来ます。

この記事はご希望通りの内容でしたか?

投稿者 campanella : 2006年08月23日 20:54 | CSS/HTML/JavaScript | 編集

line

□□□ コメント □□□

line
名前
メールアドレス
URL
コメント