例外処理について一般的な書き方を教えてください。

投稿者: Anonymous

↓のような処理では「エラーが発生しない処理」もtry-catchを囲むべきでしょうか?
エラーが発生しない処理の長さも勘案して決めるものなのでしょうか?
お手数をおかけしますが、教えて頂けると幸いです。
今回は実行不可能系のエラーは無視して考えています。
よろしくお願いします。

/* エラーが発生するかもしれない処理1 */
/* エラーが発生しない処理 */
/* エラーが発生するかもしれない処理2 */

 
1.エラーが発生しない処理もtry-catchに囲む

try {
    /* エラーが発生するかもしれない処理1 */
    /* エラーが発生しない処理 */
    /* エラーが発生するかもしれない処理2 */
} catch (Exception1 $e){
} catch (Exception2 $e){
}

2.エラーが発生しない処理はtry-catchに囲まない

try {
    /* エラーが発生するかもしれない処理1 */
} catch (Exception1 $e){
}
/* エラーが発生しない処理 */
try {
    /* エラーが発生するかもしれない処理2 */
} catch (Exception2 $e){
}

解決

「エラーが発生するかもしれない処理1」がエラーになったとして、その後の処理を行うべきですか?

/* ファイルから読み込み、計算した結果を書き込む */
try {
    読み込み;
    計算;
    書き込み;
} catch(Exception e) {
    print "どこかで失敗した!n";
}

例えば上のプログラムであれば、読み込みに失敗した時点で残りの処理は無意味ですし、失敗した結果を書き込むのは不適当でしょう。この場合は全てを一つのtryブロックで囲み、どれか一つでも失敗したら残りの処理を中止すべきです。

また、ファイルハンドルなどの「openしたら必ずcloseしないといけない」ものを扱う場合は「どこで失敗しようとcloseを行う」ことが重要になりますが、この時にも一か所のcatchやfinallyにその処理を書くだけですみます。個別にエラー処理をしていては、個別に「失敗したらclose」を書かなくてはいけません。

一方で、独立した処理を順番に行い、成功したものだけ出力したいこともあるでしょう。

/* A,B,Cはそれぞれ全く関係ない処理 */
try {
    $a = 処理A;
    print "処理Aの結果: $an";
} catch(Exception e) {
    print "処理Aに失敗n";
}

$b = 処理B;
print "処理Bの結果: $bn"

try {
    $c = 処理C;
    print "処理Cの結果: $cn";
} catch(Exception e) {
    print "処理Cに失敗n";
}

この場合は逆に、ひとつのtryブロックではどれか失敗した時点で中止してしまうので不適当です。

可読性の問題というより挙動が異なりますから、要件にあった方法を選んでください。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *