1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SuiSuiAdvent Calendar 2023

Day 14

例外処理(try-except)を活用しよう

Last updated at Posted at 2023-12-10

はじめに

Pythonの例外処理(try-except)について,簡単に紹介します.

基本構文

Pythonの例外処理の基本として,try-exceptがあります.

例として,ゼロ除算実行時に発生するZeroDivisionErrorのケースについて説明します.
ゼロ除算を実行すると以下のようなエラーが発生します.

print(1 / 0)
# ZeroDivisionError: division by zero

この例外を捕捉するには次のように記述します.

try:
    print(1 / 0)
except ZeroDivisionError:
    print('Error')
# Error

"except 例外名"try節内で例外名のエラーが発生した場合,try節のコードを中断しexcept節内のコードを実行します.
さらに,except 例外名 as 変数名とすると,変数に例外オブジェクトを格納して使用できます.例外オブジェクトはエラーメッセージなどが格納されており,エラーの内容を確認できます.

try:
    print(1 / 0)
except ZeroDivisionError as e:
    print(e)
    print(type(e))
# division by zero
# <class 'ZeroDivisionError'>

基底クラスを指定しても捕捉することができます.例えば,ZeroDivisionErrorの基底クラスはArithmeticError.変数には実際に発生した派生クラスの例外オブジェクトが格納されます.

try:
    print(1 / 0)
except ArithmeticError as e:
    print(e)
    print(type(e))
# division by zero
# <class 'ZeroDivisionError'>

複数の例外に異なる処理を実行

複数の例外を捕捉し,それぞれ異なる処理を行いたい場合は,exceptを例外ごとに設定します.

def divide(a, b):
    try:
        print(a / b)
    except ZeroDivisionError as e:
        print('catch ZeroDivisionError:', e)
    except TypeError as e:
        print('catch TypeError:', e)

divide(1, 0)
# catch ZeroDivisionError: division by zero

divide('a', 'b')
# catch TypeError: unsupported operand type(s) for /: 'str' and 'str'

複数の例外に同じ処理を実行

タプルで例外名を指定することで,1つのexcept節で複数の例外を捕捉することができます.

def divide(a, b):
    try:
        print(a / b)
    except (ZeroDivisionError, TypeError) as e:
        print(e)

divide(1, 0)
# division by zero

divide('a', 'b')
# unsupported operand type(s) for /: 'str' and 'str'

すべての例外を捕捉し,同じ処理を実行

全ての例外を捕捉したい場合は,例外名を指定せずに記述します.

try:
    print(1 / 0)
except:
    print('Error')
# Error

複数のexceptがある場合は,最後のexcept節のみ例外名を省略できます.(if文で言うelifと'''else'''みたいな)

正常終了時の処理 : else

try節で例外が発生せず終了したあとに行う処理を,else節に指定できます.

def divide(a, b):
    try:
        print(a / b)
    except ZeroDivisionError as e:
        print('catch ZeroDivisionError:', e)
    else:
        print('finish (no error)')

divide(1, 2)
# 0.5
# finish (no error)

divide(1, 0)
# catch ZeroDivisionError: division by zero

終了時に常に行う処理 : finally

例外の発生によらず,必ず最後に行う処理をfinally節に指定できます.

def divide(a, b):
    try:
        print(a / b)
    except ZeroDivisionError as e:
        print('catch ZeroDivisionError:', e)
    finally:
        print('all finish')

divide(1, 2)
# 0.5
# all finish

divide(1, 0)
# catch ZeroDivisionError: division by zero
# all finish

まとめ

  • except 例外名 : 特定の例外を捕捉
  • except 例外名 as 変数名 : 変数に例外オブジェクトを格納
  • exceptは複数設定可
  • exceptに例外名を指定しない場合,すべての例外を捕捉
try:
    print(1 / 0)
except: # tryで例外が発生した場合
    print('Error')
else: # tryで例外が発生しなかった場合
    print('finish (no error)')
finally: # 例外の発生に関わらず必ず実行
    print('all finish')

参考文献

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?