[python]例外処理

23594 ワード

try / except


異常処理を行うには、実行するコードをtryに、異常発生時に処理するコードをexceptに加えてください.
try:
    x = int(input("Enter num: "))
    y = 10 / x
    print(y)

except:  # 모든 예외 처리
    print("Exception")

特定の例外のみ処理

y = [10, 20, 30]

try:
    index, x = map(int, input().split())
    print(y[index] / x)
except ZeroDivisionError:
    print_error("Cannot be divided by 0")
except IndexError:
    print_error("Wrong Index")

例外メッセージの受信

exceptからasの後に変数を指定すると、例外エラーメッセージが表示されます.
y = [10, 20, 30]

try:
    index, x = map(int, input().split())
    print(y[index] / x)
except ZeroDivisionError as e:
    print_error("Cannot be divided by 0:", e)
except IndexError as e:
    print_error("Wrong Index:", e
複数の例外が発生した場合、最初に発生した例外の処理コードのみが実行されます.(または例外では、上層部の例外から処理を開始する

すべての例外出力


すべての例外エラーメッセージを出力する場合は、exceptExceptionを指定し、asの後に変数を追加します.
y = [10, 20, 30]

try:
    index, x = map(int, input().split())
    print(y[index] / x)
except Exception as e:  # 모든 예외 출력
    print_error("Exception:", e)

Else:異常が発生していない場合にコードを実行

y = [10, 20, 30]

try:
    index, x = map(int, input().split())
    print(y[index] / x)
except Exception as e:  # 모든 예외 출력
    print_error("Exception:", e)
else: # try의 코드에서 예외가 발생하지 않았을 때 실행된다
    print(y)

finally:コードの実行時に例外を考慮しない

y = [10, 20, 30]

try:
    index, x = map(int, input().split())
    print(y[index] / x)
except Exception as e:  # 모든 예외 출력
    print_error("Exception:", e)
else:  # try의 코드에서 예외가 발생하지 않았을 때 실행된다
    print(y)
finally: # 예외와는 상관없이 항상 실행
    print("Done")

raise:異常発生

def add_num(num):
    if num < 0:
        raise Exception("Num must be greater than 0")
    else:
        return num + 1
        
try:
    x = int(input())
    result = add_num(x)
except Exception as e:
    print("Exception: ", e)
else:
    print(result)

現在の例外を再起動

def three_multiple():
    try:
        x = int(input("Enter a multiple of 3: "))
        if x % 3 != 0:
            raise Exception("It is not a multiple of 3")
        print(x)
    except Exception as e:
        print("three_multiple() Exception", e)
        raise # re-raise


try:
    three_multiple()
except Exception as e:
    print("Script File Exception.", e)
Enter a multiple of 3: 4
three_multiple() Exception It is not a multiple of 3
Script File Exception. It is not a multiple of 3
exceptraiseが使用されている場合、例外は再び発生します.(re-raise)

assert

assertは、指定条件式が偽である場合にAssertionErrorの例外を生じ、条件式が真である場合にスキップする.assertは、デバッグモードでのみ実行されます.Pythonは基本的にデバッグモードです.(__debug__の値はTrue)
x = int(input("Enter a multiple of 3: "))
assert x % 3 == 0, "It is not a multiple of 3"
print(x)
assertを実行したくない場合は、実行時に-Oオプションを追加できます.
python -O main.py

例外の作成


例外を作成する場合は、Exceptionを継承し、新しいクラスを作成できます.次いで、__init__メソッドでベースクラスの__init__メソッドが呼び出され、エラーメッセージが追加される.
class bcolors:
    HEADER = "\033[95m"
    OKBLUE = "\033[94m"
    OKCYAN = "\033[96m"
    OKGREEN = "\033[92m"
    WARNING = "\033[93m"
    ERROR = "\033[31m"
    FAIL = "\033[91m"
    ENDC = "\033[0m"
    BOLD = "\033[1m"
    UNDERLINE = "\033[4m"


def print_error(error, e=None):
    if e:
        print(f"{bcolors.ERROR}{error} {e}{bcolors.ERROR}")
    else:
        print(f"{bcolors.ERROR}{error}{bcolors.ERROR}")


class Calculator:
    def __init__(self):
        pass

    def three_mutiple(self, x):
        try:
            x = int(input())
            if x % 3 != 0:
                raise self.__NotThreeMutipleError
            print(x)

        except Exception as e:
            print_error("ThreeMultipleException: ", e)

    class __NotThreeMutipleError(Exception):  # Exception 상속
        def __init__(self):
            super().__init__("It is not a mutiple of 3")


calc = Calculator()

calc.three_mutiple(10)

以下はException万継承、pass加入、何も実現しない.
class NotThreeMultipleError(Exception):
	pass
この場合、例外が発生した場合にエラーメッセージを入れればよい.
raise NotThreeMultipleError('3의 배수가 아닙니다.')

参考資料

  • Pythonコード印鑑