43693


初心者の頃に気になった問題です。  
`python`で、エラーが発生する場合、`try:except`文でそのエラー発生コードをくくれば、エラーを回避することが出来ます。リスト

[code]

     a = [0,1,2]
    
[/code]

として、

[code]

    a[3]
    
[/code]

を指定してやると、

[code]

    IndexError: list index out of range
    
[/code]

が起きるのは当然の流れです。  
例えば、長さのわからないリストがあり、`for`文でループを行い、それぞれの要素にアクセスするとします。そして、インデックスの範囲を超えて指定してしまったとします。目的はそのリスト全てにアクセスする事なので、例外が起きようと起きまいと、全てのリストにアクセスすることが出来た以上、問題はないと考えたとします。  
普通デベロッパーは例外が発生しないように直そうと試みるものですが、

**もし例外が発生してもしなくても、結果は変わらないものであると仮定したとして、面倒くさいとかいう理由で例外をこのまま発生させるようなだらしない感じのするコードを残しておいたとしても、アプリケーションに何らかの障害が発生するということはありませんか？**

もちろん`try:except`文によって結果が異なるような場合は、エラーを治すべきなのはよくわかっています。  
`pygame`で特定の`png`ファイルなどをロードするような場合、しばしばそのようなpngファイルが存在しないにも関わらずロードした場合、コードが止まる事を防ぐために、`try:except`でエラー回避→ファイルがないという警告・通告を行っている事があります。(例外を初めて見たのがそのコードでした。)そうした一回性の問題ならまだわかるのですが、何度もエラー回避が起こるような処理を残しておいたとすると、システムの健康にはよくないんじゃないかと考えたことがあります。初心者の頃、`for`文や`index`の指定になかなか慣れず、マップエディタの製作でヒイコラ言ってた時に、もうエラー回避しちゃえばいいかと考えた思い出があります。ちなみに今はエラー回避に頼らずちゃんとできています。  
**サンプルコード:**

[code]

    a = [1,2,3]
    
    
    f = 0
    try:
        #わざと例外を発生させる
        for i in range(len(a)+1):
            d = a[i]
    except IndexError as e:
        print("エラーが発生。")
    
        f = a[2]
    #dには3が入っています。
    print(d,f)
    
[/code]

**実行結果：**

[code]

    エラーが発生。
    3 3
    
[/code]

エラーは発生しましたが、dにはちゃんと例外発生直前の値が入っている事が確認できます。


CC BY-SA 3.0
2018-05-01T06:48:27.353
43692
2018-05-01T07:13:31.287
24284
question
python
try except文などでエラー回避を行うことに対するシステム上のペナルティはあるんでしょうか？


> アプリケーションに何らかの障害が発生するということはありませんか？

このtry/exceptのコード片だけについて言えば、ないと思います。

ただし、可読性が下がり、別のバグに起因するIndexErrorがそのtry節内で起こってもexceptで握りつぶしてしまうため修正が困難になり、修正コストが高くなり、保守不能になっていくことが想像できます。

一般的には、そういった「コードへの理解が正確でないために書いた回避コード」を書く状況では、上記のような「保守不能になっていく」というのがあまり時間をかけずに表面化してきます。また、「try/exceptで回避したこと」以外のコードも品質が高くないでしょうから、アプリケーションに障害が発生する可能性は、よく書かれたコードに比べて高いでしょう。

私の経験上、そのようなコードを見掛けたら全体の品質が低い（障害を起こす可能性が高い）と判断します。


CC BY-SA 3.0
2018-05-01T07:13:31.287
43693
2018-05-01T07:13:31.287
806
43692
answer