Pythonベース-異常

4090 ワード

例外オブジェクト
Pythonでエラーが発生すると、異常が発生します.
Pythonでは異常オブジェクトを用いて異常を表す.
例外オブジェクトが処理またはスナップされていない場合、プログラムはいわゆるトレースバックで実行を終了します.
次に例を示します.
def func1():
    raise Exception


if __name__ == "__main__":
    func1()

実行後のエラー:
(venv) E:\Codes\python_everything\begining-python\src\08>list8-2.py
Traceback (most recent call last):
  File "E:\Codes\python_everything\begining-python\src\08\list8-2.py", line 19, in 
    func1()
  File "E:\Codes\python_everything\begining-python\src\08\list8-2.py", line 15, in func1
    raise Exception
Exception

例外には異なるタイプがあり、Exceptionはベースクラスであり、以下に各シードクラスがあります.
 +-- Exception
      +-- StopIteration
      +-- StandardError
      |    +-- BufferError
      |    +-- ArithmeticError
      |    |    +-- FloatingPointError
      |    |    +-- OverflowError
      |    |    +-- ZeroDivisionError
      |    +-- AssertionError
      |    +-- AttributeError
      |    +-- EnvironmentError
      |    |    +-- IOError
      |    |    +-- OSError
      |    |         +-- WindowsError (Windows)
      |    |         +-- VMSError (VMS)
      |    +-- EOFError
      |    +-- ImportError
      |    +-- LookupError
      |    |    +-- IndexError
      |    |    +-- KeyError
      |    +-- MemoryError
      |    +-- NameError
      |    |    +-- UnboundLocalError
      |    +-- ReferenceError
      |    +-- RuntimeError
      |    |    +-- NotImplementedError
      |    +-- SyntaxError
      |    |    +-- IndentationError
      |    |         +-- TabError
      |    +-- SystemError
      |    +-- TypeError
      |    +-- ValueError
      |         +-- UnicodeError
      |              +-- UnicodeDecodeError
      |              +-- UnicodeEncodeError
      |              +-- UnicodeTranslateError

Exceptionを継承することで、独自のクラスを実現することもできます.
class SomeError(Exception): pass


def func2():
    raise SomeError


if __name__ == "__main__":
    func2()

 
例外スナップ
異常はキャプチャできますtryを使用する必要があります...except...文:
class SomeError(Exception): pass


def func2():
    raise SomeError


if __name__ == "__main__":
    try:
        func2()
    except SomeError:
        print("Some error happened")

ここではパラメータがスナップされているので、遡及しません.
(venv) E:\Codes\python_everything\begining-python\src\08>list8-3.py
Some error happened

ただし、他の例外の場合:
def func1():
    raise Exception


class SomeError(Exception): pass


def func2():
    raise SomeError


if __name__ == "__main__":
    try:
        func1()
    except SomeError:
        print("Some error happened")

ここのExceptionはキャプチャされていないので、遡ります.
(venv) E:\Codes\python_everything\begining-python\src\08>list8-3.py
Traceback (most recent call last):
  File "E:\Codes\python_everything\begining-python\src\08\list8-3.py", line 27, in 
    func1()
  File "E:\Codes\python_everything\begining-python\src\08\list8-3.py", line 15, in func1
    raise Exception
Exception

例外が発生しない場合は、続行しますが、ここではelse文を使用して、例外がない場合に実行できる文を実行し、論理全体をスムーズにすることができます.
if __name__ == "__main__":
    try:
        print("No exception")
    except SomeError:
        print("Some error happened")
    else:
        print("No error happened")

結果は次のとおりです.
(venv) E:\Codes\python_everything\begining-python\src\08>list8-3.py
No exception
No error happened

ただし、スナップできない例外が発生しても、finally文を使用することができます.
def func1():
    raise Exception


class SomeError(Exception): pass


def func2():
    raise SomeError


if __name__ == "__main__":
    try:
        func1()
    except SomeError:
        print("Some error happened")
    else:
        print("No error happened")
    finally:
        print("Do something")

Pythonではtryを使う傾向があります...except...ifの代わりに...else..文.