[python]例外処理



📌 例外処理

  • プログラムの作成中にエラーが発生します.エラーの発生はプログラムエラーの実行を防ぐためです.ただし、Pythonはこれらのエラーの処理を試みることができますが、例外的にこれらのエラーを処理することができます.
  • 📌 エラー例外処理技術


    -tryドア以外は

  • tryブロック実行中にエラーが発生した場合、除外ブロックが実行されます.ただし、tryブロックにエラーが発生しない場合は、「ブロックの除外」は実行されません.
  • []符号が存在し、カッコ内の内容を省略できることを示す慣例記号である.
  • try:
        ...
    except [발생 오류[as 오류 메시지 변수]]:
        ...   
    1)try、書き込みのみを除く
    try:
    	...
    except:
    	...
        
    2)エラーが発生した例外文を含む
    try:
    	...
    except 발생오류:
    	...
    エラーが発生した場合は、文で予め定義された「oh」名と一致した場合にのみブロックが実行されることを示します.
    3)エラーとエラーメッセージ変数を含む異常文
    try:
    	...
    except 발생 오류 as 오류 메시지 변수:
    	...
           
    #예시
    try:
        4 / 0
    except ZeroDivisionError as e:
        print(e) #오류가 발생하면 변수(e)에 담기는 오류메세지를 출력하라. division by zero출력 됨
    АААААААААААААААА\

    -try,finally文

  • finallyセクションは、例外の有無にかかわらず、常に試行文の間に実行されます.通常、finallyセクションは、使用するリソースを閉じる必要がある場合に使用します.
  • f = open('foo.txt', 'w')
    try:
        # 무언가를 수행한다.
    finally: # 항상 수행
        f.close()
    「foo.txt」ファイルを書き込みモードで開くと、例外が発生するかどうかにかかわらずfinallyセクションで開いているファイル|𐥊4|を閉じることができます.

    -複数のエラーの処理

    try:
        ...
    except 발생 오류1:
       ... 
    except 발생 오류2:
       ...
    # 예시 1
    try:
        a = [1,2]
        print(a[3]) #2개임 인덱싱 오류
        4/0 # 위에서 이미 오휴가 발생해서 오류 발생 X
    except ZeroDivisionError:
        print("0으로 나눌 수 없습니다.")
    except IndexError:
    	print("인덱싱 할 수 없습니다.")
    
    #예시 2
    try:
        a = [1,2]
        print(a[3])
        4/0
    except ZeroDivisionError as e:
        print(e)
    except IndexError as e: 
        print(e) # list index out of range 출력
    
    #예시 3
    try:
        a = [1,2]
        print(a[3])
        4/0
    except (ZeroDivisionError, IndexError) as e: #예시2(2개이상의 오류)를 묶어서 처리 가능
        print(e) # list index out of range 출력
    

    -try,else moon

  • try文がエラーを実行した場合は「除外」セクションを実行し、エラーがなければelseセクションを実行します.
  • try:
        ...
    except [발생 오류[as 오류 메시지 변수]]:
        ...
    else:  # 오류가 없을 경우에만 수행된다.
        ...
    try:
        age=int(input('나이를 입력하세요: '))
    except: # 숫자가 아닌 값
        print('입력이 정확하지 않습니다.')
    else: # 숫자, 오류가 없을때만 수행된다. 
        if age <= 18:
            print('미성년자는 출입금지입니다.')
        else:
            print('환영합니다.')

    📌 エラーを避ける

  • プログラミングの場合、特定のエラーが発生した場合、直接通過しなければならない場合があります.
  • try:
        f = open("나없는파일", 'r') # 파일없음 
    except FileNotFoundError:
        pass
    ファイルがないのでFileNotFoundError:エラーを表示するはずですが、passを使用してエラーを回避しました.

    📌 わざとまちがいを犯す

  • 常に強制実行エラーが必要な場合はf.close()コマンドを使用して強制実行エラー
  • たとえば、Birdクラスを継承するサブクラスにfly関数を実装させる場合
  • class Bird:
        def fly(self):
            raise NotImplementedError
    # bird클래스를 상속받는 자식 클래스는 반드시 fly함수를 구현해야한다는 의지를 보여줌.
    # 만약 자식 클래스가 fly함수를 구현하지 않은 상태로 fly함수를 호출한다면 어떻게 될까?
    
    class Eagle(Bird): # bird클래스를 상속받음. 
        pass # 그러나 fly함수를 구현하지 않았음. 
    
    #실행
    eagle = Eagle()
    eagle.fly()
    АЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙ\1049
    class Bird:
        def fly(self):
            raise NotImplementedError
            
    #오류를 발생시키지 않으려면 eagle클래스에 fly함수를 반드시 구현해야함. 
    class Eagle(Bird): # bird클래스를 상속받음. 
        def fly(self): #fly함수 구현
            print("very fast")
            
    #실행
    eagle = Eagle()
    eagle.fly()
    逆にfly関数を実装すると、「非常に速い」文が正常に出力されます.

    📌 例外の作成

  • プログラムの実行中に、例外処理のみを行うために例外が作成され、使用されることが多い.Python組み込みクラスraiseクラスを継承して作成できます.
  • class MyError(Exception): 
        pass
    
    def say_nick(nick):
        if nick == '바보':
            raise MyError() #바보면 에러
        print(nick)
    #실행
    say_nick("천사")
    say_nick("바보")
    #결과
    천사
    Traceback (most recent call last):
      File "/Users/princesong/Desktop/Algorithm/python/p.py", line 10, in <module>
        say_nick("바보")
      File "/Users/princesong/Desktop/Algorithm/python/p.py", line 6, in say_nick
        raise MyError()
    __main__.MyError
    
    このプログラムを実行すると、「エンジェル」が正常に出力されるとMyerrorが表示されます.
    #예외처리기법 사용
    try:
        say_nick("천사")
        say_nick("바보")
    except MyError: #에러가 발생하면 출력
        print("허용되지 않는 별명입니다.")
        
        
    #결과 - 정상 출력
    천사
    허용되지 않는 별명입니다.
    
    この場合、例外処理プロセスを使用して通常の出力を行うことができます.
  • エラーメッセージを別の方法で使用する場合は、異なる外部処理テクニックを使用します.(try、3番目の質問を参照)
  • # 오류 메시지를 표현하고 싶을때는, 
    try:
        say_nick("천사")
        say_nick("바보")
    except MyError as e:
        print(e)
     #결과
     오류 메세지 출력 X
    実行時にエラー・メッセージは出力されません.エラーメッセージを出力するときにエラーメッセージを表示するには、NotImplementedErrorメソッドをエラークラスに実装する必要があります.Exceptionメソッドはprint(e)と同様に、エラーメッセージの印刷出力時に呼び出されるメソッドである.
    class MyError(Exception):
        def __str__(self): # 위 코드에서 메서드만 추가함.
            return "허용되지 않는 별명입니다."
            
    def say_nick(nick):
        if nick == '바보':
            raise MyError()
        print(nick)
    
    try:
        say_nick("천사")
        say_nick("바보")
    except MyError as e:
        print(e)
        
    #결과
    천사
    허용되지 않는 별명입니다.