🔴

Pythonで例外処理を書く

2023/05/22に公開

独特の記述に悩まされた

Pythonで例外処理を書くと、他の言語と違って、try, catchと書かずに、try: exceptと書き、インデントの設定も必要なお作法があります。
今回は、リストの数が10を超えたら例外処理が発生するプログラムを書いてビジネスロジックを作ってみました。

以下に、Python 3を使用して例外処理を行うプログラムの例を示します。指定された要件に基づいて、print文でログを出力し、try-exceptブロックとExceptionクラスを使用します。また、必要に応じてif文やforループ、メソッドを活用します。

def divide_numbers(a, b):
    try:
        result = a / b
        print(f"Result of division: {result}")
    except ZeroDivisionError:
        print("Error: Division by zero is not allowed.")
    except Exception as e:
        print(f"Error occurred: {e}")


def process_list(numbers):
    for num in numbers:
        try:
            if num < 0:
                raise ValueError("Negative numbers are not allowed.")
            result = 100 / num
            print(f"Result of division: {result}")
        except ZeroDivisionError:
            print("Error: Division by zero is not allowed.")
        except ValueError as ve:
            print(f"Error: {ve}")
        except Exception as e:
            print(f"Error occurred: {e}")


# 数値の除算の例外処理
divide_numbers(10, 2)   # 出力: Result of division: 5.0
divide_numbers(10, 0)   # 出力: Error: Division by zero is not allowed.
divide_numbers("10", 2)  # 出力: Error occurred: unsupported operand type(s) for /: 'str' and 'int'

# リストの要素を処理する例外処理
number_list = [10, 5, 0, -3, 20]
process_list(number_list)
# 出力:
# Result of division: 10.0
# Result of division: 20.0
# Error: Division by zero is not allowed.
# Error: Negative numbers are not allowed.
# Result of division: 5.0

実行結果

/usr/local/bin/python3.10 /Applications/PyCharm CE.app/Contents/plugins/python-ce/helpers/pydev/pydevd.py --multiprocess --qt-support=auto --client 127.0.0.1 --port 51093 --file /Users/hashimotojunichi/PycharmProjects/python_programing/main.py 
Connected to pydev debugger (build 231.8770.66)
Result of division: 5.0
Error: Division by zero is not allowed.
Error occurred: unsupported operand type(s) for /: 'str' and 'int'
Result of division: 10.0
Result of division: 20.0
Error: Division by zero is not allowed.
Error: Negative numbers are not allowed.
Result of division: 5.0

Process finished with exit code 0

divide_numbers関数: この関数は2つの引数aとbを受け取り、aをbで除算します。この関数は3つの例外を処理します。

ZeroDivisionError: bが0の場合、このエラーが発生します。このエラーは、0で除算することは数学的に不可能であるためです。
その他の一般的な例外: aまたはbが数値でない場合など、除算が行えないその他の理由により、一般的な例外が発生します。この場合、エラーメッセージが出力されます。
process_list関数: この関数はリストnumbersを引数に取り、リストの各要素を100で除算します。この関数は3つの例外を処理します。

ZeroDivisionError: リストの要素が0の場合、このエラーが発生します。
ValueError: リストの要素が負の数の場合、このエラーが発生します。このエラーは、関数内で明示的にraiseされます。
その他の一般的な例外: 除算が行えないその他の理由により、一般的な例外が発生します。この場合、エラーメッセージが出力されます。
このコードの目的は、除算操作が失敗する可能性のあるシナリオを安全に処理し、適切なエラーメッセージを出力することです。これにより、プログラムは予期しないエラーによりクラッシュすることなく、適切に動作を続けることができます。

raiseとは?

仕事で使ったときに、raiseを使ったことあるのですが、どんな意味か忘れてたので、また調べました。

raiseはPythonのキーワードで、例外を明示的に発生させるために使用されます。例外は、プログラムの実行中に何か問題が発生したときに、通常の制御フローを中断するための特殊なオブジェクトです。

raiseステートメントは通常、エラー条件が発生したときに使用されます。これにより、エラーを検出したコードからエラーを処理するコードへ制御が移行します。

以下に、raiseの使用例を示します:

def validate_age(age):
    if age < 0:
        raise ValueError("Age cannot be negative")

try:
    validate_age(-1)
except ValueError as e:
    print(e)

このコードでは、validate_age関数は年齢が負の値であるかどうかをチェックします。もし年齢が負の値であれば、raiseステートメントがValueError例外を発生させ、エラーメッセージ"Age cannot be negative"を含めます。この例外は、try/exceptブロックによって捕捉され、エラーメッセージが出力されます。

Discussion