【初心者向け】PythonでOSError例外をキャッチする方法を解説
OSErrorとは?
OSErrorは、Pythonのosモジュールに対応する例外クラスで、OS固有の関数からエラーが返されたときに発生します。「ファイルが存在しない」「アクセス権限がない」「無効なファイルディスクリプタが指定された」など、オペレーティングシステムレベルの問題を扱う際によく見られる例外です。
この記事では、try-except構文を使ってOSErrorをキャッチし、エラーの内容と種類を確認する方法を具体例とともに紹介します。
OSErrorをキャッチするサンプルコード
以下のスクリプトでは、ファイルディスクリプタ0〜4に対応する端末名をos.ttyname()で取得しようとしています。開かれていないディスクリプタにアクセスした時点でOSErrorが発生するため、それをexceptブロックで捕捉します。
#foobar.py
import os
import sys
try:
for i in range(5):
print(i, os.ttyname(i))
except Exception as e:
print(e)
print(type(e))
実行方法
Linuxのターミナルで次のコマンドを実行します。
$ python foobar.py
出力結果
0 /dev/pts/0 1 /dev/pts/0 2 /dev/pts/0 3 [Errno 9] Bad file descriptor <class 'OSError'>
出力の解説
ディスクリプタ0〜2(標準入力・標準出力・標準エラー出力)は有効な端末に接続されているため、それぞれ/dev/pts/0という端末名が出力されます。一方、ディスクリプタ3は開かれていないため、[Errno 9] Bad file descriptor(無効なファイルディスクリプタ)というOSErrorが発生し、ループはそこで中断されます。
exceptブロックでは、例外オブジェクトeを出力することでエラーメッセージを確認でき、type(e)によって例外のクラスがOSErrorであることもわかります。
補足:より具体的な例外処理の書き方
ExceptionではなくOSErrorそのものを指定してキャッチすれば、意図しない例外まで拾ってしまうのを防げます。さらに、例外オブジェクトのerrno属性を使えば、エラー番号ごとに処理を分岐することも可能です。
try:
print(os.ttyname(3))
except OSError as e:
if e.errno == 9: # EBADF: 無効なファイルディスクリプタ
print("無効なファイルディスクリプタです")
else:
raise
このようにOSErrorはerrno情報を持っているため、エラーの種類に応じた柔軟なハンドリングが行えます。OS関連の処理を書く際は、try-exceptによる例外処理を組み込んでおくと安心です。
-
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の文法上できません。 現実的な回避策:関数へ処理を委譲する この制限に対する実用的な解決策のひとつが、例外が発生しうる部分式の評価を「関数」に委譲する方法です。関数の中