Python3-例外処理

Pythonは、Pythonプログラムの予期しないエラーを処理し、それらにデバッグ機能を追加するための2つの非常に重要な機能を提供します-

  • Exception Handling−これはこのチュートリアルでカバーされます。Pythonで利用可能な標準例外のリスト-標準例外は次のとおりです。

  • Assertions−これはPython3チュートリアルのアサーションでカバーされます。

標準例外

Pythonで利用可能な標準例外のリストは次のとおりです。−

シニア番号 例外の名前と説明
1

Exception

すべての例外の基本クラス

2

StopIteration

イテレータのnext()メソッドがオブジェクトを指していない場合に発生します。

3

SystemExit

sys.exit()関数によって発生します。

4

StandardError

StopIterationとSystemExitを除くすべての組み込み例外の基本クラス。

5

ArithmeticError

数値計算で発生するすべてのエラーの基本クラス。

6

OverflowError

計算が数値型の上限を超えたときに発生します。

7

FloatingPointError

浮動小数点の計算が失敗したときに発生します。

8

ZeroDivisonError

すべての数値タイプでゼロによる除算またはモジュロが発生した場合に発生します。

9

AssertionError

Assertステートメントが失敗した場合に発生します。

10

AttributeError

属性の参照または割り当てに失敗した場合に発生します。

11

EOFError

raw_input()またはinput()関数からの入力がなく、ファイルの終わりに達したときに発生します。

12

ImportError

インポートステートメントが失敗したときに発生します。

13

KeyboardInterrupt

ユーザーがプログラムの実行を中断したときに発生します。通常はCtrl + cを押します。

14

LookupError

すべてのルックアップエラーの基本クラス。

15

IndexError

インデックスがシーケンスに見つからない場合に発生します。

16

KeyError

指定されたキーが辞書に見つからない場合に発生します。

17

NameError

ローカルまたはグローバル名前空間で識別子が見つからない場合に発生します。

18

UnboundLocalError

関数またはメソッドのローカル変数にアクセスしようとしたが、値が割り当てられていない場合に発生します。

19

EnvironmentError

Python環境の外部で発生するすべての例外の基本クラス。

20

IOError

存在しないファイルを開こうとしたときのprintステートメントやopen()関数など、入出力操作が失敗したときに発生します。

21

OSError

オペレーティングシステム関連のエラーのために発生します。

22

SyntaxError

Python構文にエラーがある場合に発生します。

23

IndentationError

インデントが適切に指定されていない場合に発生します。

24

SystemError

インタープリターが内部の問題を見つけたときに発生しますが、このエラーが発生した場合、Pythonインタープリターは終了しません。

25

SystemExit

sys.exit()関数を使用してPythonインタープリターが終了したときに発生します。コードで処理されない場合、インタプリタを終了させます。

26

TypeError

指定されたデータ型に対して無効な操作または関数が試行されたときに発生します。

27

ValueError

データ型の組み込み関数に有効な型の引数があるが、引数に無効な値が指定されている場合に発生します。

28

RuntimeError

生成されたエラーがどのカテゴリにも分類されない場合に発生します。

29

NotImplementedError

継承されたクラスに実装する必要がある抽象メソッドが実際に実装されていない場合に発生します。

Pythonでのアサーション

アサーションは、プログラムのテストが終了したときにオンまたはオフにできるサニティチェックです。

  • アサーションを考える最も簡単な方法は、アサーションを次のように例えることです。 raise-ifステートメント(より正確には、raise-if-notステートメント)。式がテストされ、結果がfalseになると、例外が発生します。

  • アサーションは、バージョン1.5で導入されたPythonの最新キーワードであるassertステートメントによって実行されます。

  • プログラマーは、有効な入力をチェックするために関数の開始時にアサーションを配置し、有効な出力をチェックするために関数呼び出しの後にアサーションを配置することがよくあります。

assertステートメント

アサートステートメントに遭遇すると、Pythonは付随する式を評価します。これはうまくいけばtrueです。式がfalseの場合、PythonはAssertionError例外を発生させます。

assertの構文は次のとおりです。

assert Expression[, Arguments]

アサーションが失敗した場合、PythonはAssertionErrorの引数としてArgumentExpressionを使用します。AssertionError例外は、try-exceptステートメントを使用して、他の例外と同様にキャッチおよび処理できます。それらが処理されない場合、それらはプログラムを終了し、トレースバックを生成します。

これは、与えられた温度をケルビン度から華氏度に変換する関数です。0°Kはそれが得るのと同じくらい冷たいので、それが負の温度を見ると関数はベイルアウトします-

#!/usr/bin/python3

def KelvinToFahrenheit(Temperature):
   assert (Temperature >= 0),"Colder than absolute zero!"
   return ((Temperature-273)*1.8)+32

print (KelvinToFahrenheit(273))
print (int(KelvinToFahrenheit(505.78)))
print (KelvinToFahrenheit(-5))

上記のコードを実行すると、次の結果が得られます。

32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!

例外とは何ですか?

例外は、プログラムの実行中に発生するイベントであり、プログラムの命令の通常のフローを中断します。一般に、Pythonスクリプトが対処できない状況に遭遇すると、例外が発生します。例外は、エラーを表すPythonオブジェクトです。

Pythonスクリプトで例外が発生した場合は、すぐに例外を処理する必要があります。そうしないと、終了して終了します。

例外の処理

例外を発生させる可能性のある疑わしいコードがある場合は、疑わしいコードをに配置することでプログラムを防御できます。try:ブロック。try:ブロックの後、except: ステートメントの後に、問題を可能な限りエレガントに処理するコードのブロックが続きます。

構文

これがtry .... except ... elseブロックの簡単な構文です-

try:
   You do your operations here
   ......................
except ExceptionI:
   If there is ExceptionI, then execute this block.
except ExceptionII:
   If there is ExceptionII, then execute this block.
   ......................
else:
   If there is no exception then execute this block.

上記の構文に関するいくつかの重要なポイントがあります-

  • 1つのtryステートメントに複数のexceptステートメントを含めることができます。これは、tryブロックにさまざまなタイプの例外をスローする可能性のあるステートメントが含まれている場合に役立ちます。

  • 例外を処理する一般的なexcept句を指定することもできます。

  • 例外句の後に、else句を含めることができます。elseブロックのコードは、try:ブロックのコードで例外が発生しない場合に実行されます。

  • else-blockは、try:ブロックの保護を必要としないコードに適した場所です。

この例では、ファイルを開き、ファイルにコンテンツを書き込み、まったく問題がないため、正常に出力されます。

#!/usr/bin/python3

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
except IOError:
   print ("Error: can\'t find file or read data")
else:
   print ("Written content in the file successfully")
   fh.close()

これにより、次の結果が生成されます-

Written content in the file successfully

この例では、書き込み権限がないファイルを開こうとするため、例外が発生します-

#!/usr/bin/python3

try:
   fh = open("testfile", "r")
   fh.write("This is my test file for exception handling!!")
except IOError:
   print ("Error: can\'t find file or read data")
else:
   print ("Written content in the file successfully")

これにより、次の結果が生成されます-

Error: can't find file or read data

例外のない例外条項

次のように定義された例外なしでexceptステートメントを使用することもできます-

try:
   You do your operations here
   ......................
except:
   If there is any exception, then execute this block.
   ......................
else:
   If there is no exception then execute this block.

この種の try-exceptステートメントは、発生するすべての例外をキャッチします。ただし、この種のtry-exceptステートメントを使用すると、すべての例外がキャッチされますが、発生する可能性のある問題の根本原因をプログラマーが特定できないため、プログラミングの適切な方法とは見なされません。

複数の例外がある例外条項

次のように、同じexceptステートメントを使用して複数の例外を処理することもできます。

try:
   You do your operations here
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block.

トライファイナル条項

あなたは使用することができます finally: と一緒にブロック try:ブロック。ザ・finally:blockは、try-blockで例外が発生したかどうかに関係なく、実行する必要のあるコードを配置する場所です。try-finallyステートメントの構文は次のとおりです-

try:
   You do your operations here;
   ......................
   Due to any exception, this may be skipped.
finally:
   This would always be executed.
   ......................

Note−except節またはfinally節を指定できますが、両方を指定することはできません。else句をfinally句と一緒に使用することはできません。

#!/usr/bin/python3

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
finally:
   print ("Error: can\'t find file or read data")
   fh.close()

書き込みモードでファイルを開く権限がない場合、次の結果が生成されます-

Error: can't find file or read data

同じ例を次のようにすっきりと書くことができます−

#!/usr/bin/python3

try:
   fh = open("testfile", "w")
   try:
      fh.write("This is my test file for exception handling!!")
   finally:
      print ("Going to close the file")
      fh.close()
except IOError:
   print ("Error: can\'t find file or read data")

これにより、次の結果が生成されます-

Going to close the file

tryブロックで例外がスローされる、実行はすぐにfinallyブロックに渡されます。finishブロック内のすべてのステートメントが実行された後、例外が再度発生し、try-exceptステートメントの次の上位層に存在する場合はexceptステートメントで処理されます。

例外の引数

例外には引数を含めることができます。これは、問題に関する追加情報を提供する値です。引数の内容は例外によって異なります。次のようにexcept句に変数を指定することにより、例外の引数をキャプチャします。

try:
   You do your operations here
   ......................
except ExceptionType as Argument:
   You can print value of Argument here...

単一の例外を処理するコードを作成する場合は、exceptステートメントの例外の名前の後に変数を付けることができます。複数の例外をトラップしている場合は、例外のタプルの後に変数を付けることができます。

この変数は、主に例外の原因を含む例外の値を受け取ります。変数は、タプルの形式で単一の値または複数の値を受け取ることができます。このタプルには通常、エラー文字列、エラー番号、およびエラーの場所が含まれています。

以下は、単一の例外の例です-

#!/usr/bin/python3

# Define a function here.
def temp_convert(var):
   try:
      return int(var)
   except ValueError as Argument:
      print ("The argument does not contain numbers\n", Argument)

# Call above function here.
temp_convert("xyz")

これにより、次の結果が生成されます-

The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'

例外を発生させる

raiseステートメントを使用すると、いくつかの方法で例外を発生させることができます。の一般的な構文raise ステートメントは次のとおりです-

構文

raise [Exception [, args [, traceback]]]

ここで、Exception例外のタイプ(たとえば、NameError)であり、argumentは例外引数の値です。引数はオプションです。指定しない場合、例外引数はNoneです。

最後の引数tracebackもオプションであり(実際にはめったに使用されません)、存在する場合は、例外に使用されるtracebackオブジェクトです。

例外は、文字列、クラス、またはオブジェクトです。Pythonコアが発生させる例外のほとんどはクラスであり、引数はクラスのインスタンスです。新しい例外の定義は非常に簡単で、次のように実行できます。

def functionName( level ):
   if level <1:
      raise Exception(level)
      # The code below to this would not be executed
      # if we raise the exception
   return level

Note−例外をキャッチするには、「except」句が、クラスオブジェクトまたは単純な文字列としてスローされた同じ例外を参照する必要があります。たとえば、上記の例外をキャプチャするには、次のようにexcept句を記述する必要があります。

try:
   Business Logic here...
except Exception as e:
   Exception handling here using e.args...
else:
   Rest of the code here...

次の例は、例外を発生させる使用法を示しています-

#!/usr/bin/python3

def functionName( level ):
   if level <1:
      raise Exception(level)
      # The code below to this would not be executed
      # if we raise the exception
   return level

try:
   l = functionName(-10)
   print ("level = ",l)
except Exception as e:
   print ("error in level argument",e.args[0])

これにより、次の結果が生成されます

error in level argument -10

ユーザー定義の例外

Pythonでは、標準の組み込み例外からクラスを派生させることにより、独自の例外を作成することもできます。

これはRuntimeErrorに関連する例です。ここでは、RuntimeErrorからサブクラス化されたクラスが作成されます。これは、例外がキャッチされたときに、より具体的な情報を表示する必要がある場合に役立ちます。

tryブロックでは、ユーザー定義の例外が発生し、exceptブロックでキャッチされます。変数eは、クラスNetworkerrorのインスタンスを作成するために使用されます。

class Networkerror(RuntimeError):
   def __init__(self, arg):
      self.args = arg

したがって、上記のクラスを定義したら、次のように例外を発生させることができます。

try:
   raise Networkerror("Bad hostname")
except Networkerror,e:
   print e.args