Pythonの例外処理


この記事では、Python での一般的な例外処理の詳細を参考のためにリストします。詳細は次のとおりです:

1. 例外のスローとカスタム例外

Python は異常な状況を表すために例外オブジェクトを使用します。エラーが発生すると例外がスローされます。例外オブジェクトが処理されない、またはキャッチされない場合、プログラムはいわゆるトレースバック (エラー メッセージ) を表示して実行を終了します。

①.raise ステートメント

Python の raise キーワードは、例外を発生させるために使用されます。これは、次に示すように、C# および Java の throw キーワードと基本的に同じです。以下:

# -- coding: utf-8 --

def ThorwErr():
  raise Exception("抛出一个异常")

# Exception: 抛出一个异常
ThorwErr()

raise キーワードの後に​​は、一般的な例外タイプ (Exception) が続きます。一般的に、スローされる例外は詳細であるほど良いです。Python は例外の中にあります。 module 多くの組み込み例外タイプがあります。次のように dir 関数を使用して、例外内の例外タイプを表示できます:

import exceptions

# ['ArithmeticError', 'AssertionError'.....]
print dir(exceptions)

例外の受け渡し

例外をキャッチしたが、それを再発生させたい (例外を渡す) 場合は、パラメーターなしで raise ステートメントを使用できます。

#
# -- coding: utf-8 --
class MuffledCalculator:
  muffled = False
  def calc(self,expr):
    try:
      return eval(expr)
    except ZeroDivisionError:
      if self.muffled:
        print 'Division by zero is illegal'
      else:
        raise

##②.例外タイプの自動定義

Python で独自の特別なタイプの例外をカスタマイズすることもできます。必要なのは、Exception クラスから (直接または間接的に) 継承することだけです。


class SomeCustomException(Exception):
  pass

2. 例外のキャッチ

C# の try/catch と同様に、Python では次のように try/excel キーワードを使用して例外をキャッチします。 :


# -- coding: utf-8 --

try:
  print 2/0
except ZeroDivisionError:
  print '除数不能为0'

#①.複数の例外をキャッチする

Except ステートメントでは、それ以外の場合は、その後に宣言された例外タイプのみがキャッチされます。例外がスローされる可能性があります。 例外のタイプには、Exception ステートメントを追加する必要があります。または、次のように、Exception などのより一般的な例外タイプを指定できます。

# -- coding: utf-8 --
try:
  print 2/'0'
except ZeroDivisionError:
  print '除数不能为0'
except Exception:
  print '其他类型异常'

複数の例外をキャッチするには例外、複数の例外ステートメントを宣言することに加えて、例外ステートメントの後に複数の例外をタプルとしてリストすることもできます:

# -- coding: utf-8 --
try:
  print 2/'0'
except (ZeroDivisionError,Exception):
  print '发生了一个异常'

②. 例外情報の取得

各例外にはいくつかの例外情報があります。通常の状況では、これらの例外情報を記録する必要があります:

# -- coding: utf-8 --
try:
  print 2/'0'
except (ZeroDivisionError,Exception) as e:
  # unsupported operand type(s) for /: 'int' and 'str'
  print e

3. 最後に句

finally 句は try 句と組み合わせて使用​​されますが、Except ステートメントとは異なり、try 句内で例外が発生したかどうかに関係なく、finally 句のコードが実行されます。一般に、finally 自体は、ファイルまたはソケットを閉じるためによく使用されます。

うわー