PythonでIndentationError(インデントエラー)をキャッチする方法
IndentationError(インデントエラー)は、Pythonのパーサーがインデントのルールに従っていないソースコードを検出したときに発生する例外です。このエラーは構文解析(コンパイル)の段階で起こるため、通常のtry/exceptブロックでは捕捉が難しいという特徴があります。
IndentationErrorをキャッチできるケースとできないケース
IndentationErrorは、別のモジュールをインポートするときであればキャッチできます。モジュールは初めてインポートされる際にコンパイルされるため、そのタイミングであればtry/exceptで例外を受け取ることが可能です。
一方で、try/exceptブロックを含む同じモジュール内ではキャッチできません。この例外が発生すると、Pythonはそのモジュールのコンパイルを完了できず、モジュール内のコードは一切実行されないからです。
例
以下のように、インデントが不正なコードを含む関数を定義して実行してみます。
def f(): z = ['foo', 'bar'] for i in z: if i == 'foo': print(i)
出力
File "C:/Users/TutorialsPoint1/~.py", line 5
if i == 'foo':
^
IndentationError: expected an indented block
このように、スクリプトを実行した時点でIndentationErrorが発生し、プログラムは最後まで実行されることなく終了します。「expected an indented block(インデントされたブロックが必要です)」というメッセージは、if文などの後にインデントされた処理が存在しないことを示しています。
IndentationErrorへの対処法
そもそもエラーを発生させないために、次のポイントを押さえておきましょう。
- if文、for文、while文、def文などの後には、必ずインデントされたブロックを記述する
- インデントには半角スペース4つを使うのがPythonの標準スタイル(PEP 8準拠)
- タブとスペースを混在させない。エディタの設定でどちらかに統一しておく
- IDEの自動インデント機能やリンター(flake8、pylintなど)を活用し、実行前にチェックする
-
PythonでKeyError例外をキャッチする方法をわかりやすく解説
Pythonでは、辞書(dict)に存在しないキーを使って値へアクセスしようとすると、KeyError例外が発生します。この記事では、try-except文を使ってKeyErrorをキャッチし、例外の種類や詳細情報を確認する方法を解説します。 KeyErrorが発生する仕組み 次のコードは、辞書に存在しないキー c で値を取得しようとしているため、KeyErrorが発生します。sys.exc_info() を使うと、発生した例外の型などの情報を取得できます。 import sys try: s = {a: 5, b: 7}[c] except: print(sys.exc_i
-
Pythonのリスト内包表記で例外をキャッチするには?原因と対処法を解説
Pythonには、例外を処理したり無視したりするための組み込み関数は存在しません。そのため、リスト内包表記の中ですべての例外を処理することは不可能です。 その理由は、リスト内包表記が「式(expression)」で構成されている点にあります。例外のキャッチや無視、ハンドリングを行えるのは「文(statement)」である try〜except ブロックだけだからです。式の中に try-except を埋め込むことは、Pythonの文法上できません。 現実的な回避策:関数へ処理を委譲する この制限に対する実用的な解決策のひとつが、例外が発生しうる部分式の評価を「関数」に委譲する方法です。関数の中