セクション 2. 章 5
single
例外処理のベストプラクティス
メニューを表示するにはスワイプしてください
例外における 'as' キーワード
as キーワードは例外処理で例外インスタンスを取得するために使用。エラーの詳細情報を取得でき、ログ記録やエラーへの適切な対応に役立つ。
1234try: x = 10 / 0 except ZeroDivisionError as e: print(f"Caught an exception: {e}")
トレースバックとは?
トレースバックは、例外が発生するまでにプログラムがたどった実行経路の詳細を提供。プログラム内で呼び出された関数や、これらの呼び出しが行われたコードファイルの行番号が含まれる。トレースバックは、開発や本番環境でのエラーのデバッグに不可欠。
Traceback (most recent call last):
File "example.py", line 7, in <module>
main()
File "example.py", line 4, in main
divide_by_zero()
File "example.py", line 2, in divide_by_zero
return 1 / 0
ZeroDivisionError: division by zero
例外処理における良い実践
1. 一般的すぎる例外の捕捉
# Bad Practice
try:
process_data(data)
except Exception:
pass
# Best Practice
try:
process_data(data)
except SpecificError:
handle_error()
一般的すぎる例外を捕捉すると、エラーの根本原因が不明瞭になり、デバッグが困難になるだけでなく、特定の対応が必要な他の問題を見逃す可能性があり、ソフトウェアの信頼性や保守性が低下する。
2. 例外の捕捉と再送出
例外発生時に何らかの処理を行い、その後例外を上位に伝播させたい場合。
# Best Practice
try:
do_something()
except Exception as e:
log_error(e)
raise # Better: Re-raises the current exception
注意
log_error(e)やprint(e)関数は、エラーの完全なトレースバックを表示するため、開発時には有用である。しかし、本番環境ではトレースバックに機密情報が含まれることが多く、アプリケーションの脆弱性につながる可能性がある。
3. 例外処理のパフォーマンス
コード内で try-except ブロック を多用しすぎると、プログラムの実行速度が低下するため、必要な場合のみに使用する。
if 文の利用は一般的に高速かつ効率的である。
タスク
スワイプしてコーディングを開始
次のPythonスクリプトを、ベストプラクティスに基づいた例外処理の改善を目的としてリファクタリングしてください。
def process_data(data):
try:
return data[0] / data[-1]
except:
print("An error occurred.")
# Example usage
result = process_data([1, 2, 0])
- コードは、処理を進める前にデータリストが空でないことを確認し、
ValueErrorを使用します。 - リファクタリング後のコードでは、包括的な
ZeroDivisionError節の代わりに、特定の例外(TypeError、IndexError、except)を捕捉します。 - 各例外タイプごとに、何が問題だったのかをより詳しく伝えるカスタムエラーメッセージを用意します。
解答
すべて明確でしたか?
フィードバックありがとうございます!
セクション 2. 章 5
single
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください