14791


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

[code]

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

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

[code]

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

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

[code]

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


CC BY-SA 3.0
2015-08-24T06:37:03.430
14790
2015-08-24T08:14:52.233
2015-08-24T08:14:52.233
8000
7918
question
php
例外処理について一般的な書き方を教えてください。


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

[code]

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

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

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

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

[code]

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

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

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


CC BY-SA 3.0
2015-08-24T07:00:01.937
14791
2015-08-24T07:08:15.020
2015-08-24T07:08:15.020
8000
8000
14790
answer


いわゆる「予期せぬエラー」の扱いをどうするか？という設計の話だと思いますが必要に応じて選ぶ形になります。

# パターン１

プログラミン時に想定出来ないエラーが発生した場合はコンソールにスタックトレースを表示しプログラムは終了する。この場合は、catch
しないようにすれば良いです。

# パターン２

プログラミン時に想定出来ないエラーが発生した場合は、一定のエラー処理を行う。  
この場合は、どこかでCatch出来るようにしてエラー処理を実行して下さい。

どこでCatchすべきかはプログラムの内容次第で例えばコンソールアプリケーションでMain()でCatchすれば良いのであればMain()に書きます。

個人的には、ちょっとしたプログラムであれば「パターン１」、ある程度の規模以上であれば、「パターン２」で、ログ出力、セッションのクローズなどの後始末をエラー処理に書くかなと思います。


CC BY-SA 3.0
2015-08-24T07:04:01.333
14792
2015-08-24T07:04:01.333
2020-06-17T08:14:45.997
-1
5008
14790
answer