Pythonの異常捕獲メカニズム

17647 ワード

前言:この間、他人にPythonの授業設定と完了を書くとき、業務ロジックの必要性、あるいは自分のコードロジックの不完全な行のため、テストを行うときにpython解釈器が様々な異常を投げ出すので、ここでpythonの異常捕獲メカニズムを整理し、自分に簡単なまとめをしました.
ターゲット
  • 異常の概念
  • 捕獲異常
  • 異常の伝達
  • 異常
  • を投げ出す
    1.異常の概念
  • プログラムが実行されると、pyton解釈器がエラーに遭遇すると、プログラムの実行が終了し、エラー情報が表示されます.これが異常です.
  • プログラムが実行を停止し、エラーメッセージを提示するこの動作を放出異常と呼ぶ.(初めてmermaidを使いますが、ご了承ください)
  • 開発したプログラムは,業務に対して異なるコードを記述し,異常を受信して処理する.
    Pythonは構文に合致するpythonコードを実行する
    異常
    製品が安定して丈夫である.
    はっきり言って、異常を捕獲するのは製品の安定性と丈夫性のためです.
    2.異常のキャプチャ
    2.1異常を単純にキャプチャする構文
  • プログラム開発において、あるコードの実行が正しいか否かが不確定である場合、tryを増やして異常
  • をキャプチャすることができる.
  • 異常をキャプチャする最も簡単な構文フォーマット:
  • try:
    	pass #         
    except:
    	pass #        
    
  • try:試行、下に試行するコードを書き、正常に実行できるかどうか分からないコード
  • except:そうでなければ、試行に失敗したコードケース1:
  • を書きます.
    try:
        #           
        num = int(input('       :'))
        result = 10 / num
        print(result)
    except:
    	print('        ')
    

    テストしてみましょう
           :10
    1.0
    
    Process finished with exit code 0
    

    文字を入力します.
           :a
           
    

    明らかに、このメカニズムは強い.
    2.2エラータイプ取得
  • プログラムの実行時に、異なるタイプの異常に遭遇する可能性があり、異なるタイプの異常に対して異なる応答を行う必要があり、この場合、
  • のエラータイプをキャプチャする必要がある.
  • 構文は次のとおりです:
  • try:
        #        
        pass
    except     1:
        #       1,       
        pass
    except (    2,     3):
        #       2   3,       
        pass
    except Exception as result:
        print("     %s" % result)
    
  • Python解釈器が異常を投げ出したとき、最後の行のエラーメッセージの最初の単語は、エラータイプです!!!try-except文が適用されない場合:
  • num = int(input('       :'))
    print(num)
    

    次の文字を入力します.
           :a
    Traceback (most recent call last):
     File "  python       ", line (         ), in <module>
       num = int(input('       :'))
    ValueError: invalid literal for int() with base 10: 'a'
    

    この中のエラーメッセージの最初の単語はValueErrorで、これがエラータイプです.取得エラーのタイプ
    try:
        #           
        num = int(input('       :'))
        result = 10 / num
        print(result)
    except ZeroDivisionError:
        print(' 0  ')
    except ValueError:
        print('         ')
    

    不明なエラーのキャプチャ
  • 開発時に、発生する可能性のあるすべてのエラーを予断するか、それとも一定の難易度を持つ
  • か.
  • プログラムにエラーが発生しても、Python解釈器の放出異常によってプログラムが終了しないようにするには、次のexcept構文を追加します.
  • except Exception as e:
        print("     %s" % e)
    

    ここではこのExceptionクラスを簡単に見てみましょう.
    class Exception(BaseException):
        """ Common base class for all non-exit exceptions. """
        def __init__(self, *args, **kwargs): # real signature unknown
            pass
    
        @staticmethod # known case of __new__
        def __new__(*args, **kwargs): # real signature unknown
            """ Create and return a new object.  See help(type) for accurate signature. """
            pass
    

    BaseExceptionクラスから継承され、初期化時にメタグループとキーワードパラメータを入力し、静的メソッドに従ってクラス構造が明確になります.
    2.3異常取得完全構文
  • 実際の開発では,複雑な異常を処理できるように,完全な異常構文は以下の通りである:
  • try:
        #        
        pass
    except     1:
        #       1,       
        pass
    except     2:
        #       2,       
        pass
    except (    3,     4):
        #       3   4,       
        pass
    except Exception as result:
        #       
        print(result)
    else:
        #            
        pass
    finally:
        #        ,       
        print("       ,       ")
    
  • else異常がない場合にのみ実行されるコード
  • finally異常の有無にかかわらず実行されるコードケース1最適化
  • try:
        #           
        num = int(input('       :'))
        result = 10 / num
        print(result)
    except ValueError:
        print('         ')
    except Exception as e:
        print('     %s' % e)
    else:
        print('    ')
    finally:
        print('            ')
    

    3.異常の伝達
  • 異常の伝達-関数/メソッドが異常を実行すると、関数/メソッドの呼び出し側
  • に異常が伝達される.
  • メインプログラムに渡されても異常処理がない場合、プログラムは
  • で終了する.
    ヒント:
  • 開発では、主関数に異常キャプチャ
  • を追加することができる.
  • で呼び出された他の関数は、例外が発生すると、主関数の例外取得に渡されます.これにより、コードに大量の異常捕捉を加えることなく、コードのクリーン化を保証することができる
  • .
    ケース2
    def fun1():
        return int(input('       :'))
    def fun2():
        return fun1()
    try:
        print(fun2())
    except Exception as e:
        print(e)
    finally:
        print('    ')
    

    4.raise異常放出
    4.1シーンの適用
  • 開発中、コード実行エラーPythonインタプリタが異常を放出する以外は
  • .
  • はまた、アプリケーション固有のビジネス要件に基づいて例外例を自発的に放出することもできる.
  • ユーザーにパスワードの入力を要求し、長さが8未満の場合、異常注意を投げ出す.
  • 現在の関数は、ユーザにパスワードの入力を促すだけであり、パスワードの長さが正しくない場合、
  • を追加処理するために他の関数が必要である.
    したがって、
  • は、異常を放出することができ、他の処理が必要な関数によって異常
  • をキャプチャする.


    4.2放出異常
  • Pythonでは、Exception例外クラス
  • が提供されています.
  • 開発時、特定のビジネスニーズを満たす場合、異常を投げ出したい場合は、次のことができます.
  • Exceptionオブジェクトを作成する
  • raiseキーワードを使用して例外オブジェクト
  • を投げ出す

    需要
  • 定義input_password関数、ユーザーにパスワード
  • の入力を促す
  • ユーザが長さ<8を入力と、異常
  • が放出される.
  • ユーザーが長さ>=8を入力と、入力されたパスワードコードは次のように返される:
  • .
    def input_password():
        pwd = input('     :')
        #    < 8       
        if len(pwd) >= 8:
            return pwd
        print('      ')
        #                       
        #    Exception __init__(self, self, *args, **kwargs) ?
        ex = Exception("      ,       ")
        raise ex
    try:
        print(input_password())
    except Exception as e:
        print(e)
    

    これで終わり、時間を記録しましょう.
    In [1]: from datetime import datetime
    
    In [2]: print(datetime.now())
    2020-02-15 14:07:56.561248
    
    In [3]: