Python3-python-exceptions

提供:Dev Guides
移動先:案内検索

Python 3-例外処理

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

  • 例外処理-これについては、このチュートリアルで説明します。 Pythonで利用可能な標準の例外のリストを次に示します-link:/python3/python_exceptions#standard_exceptions [Standard Exceptions]。
  • アサーション-これはlink:/python3/python_exceptions#assertion_python [Assertions in Python 3]チュートリアルでカバーされます。

標準的な例外

Pythonで利用可能な標準例外のリストを以下に示します。 −

Sr.No. Exception Name & Description
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ステートメント)に例えることです。 式がテストされ、結果が偽になると、例外が発生します。
  • アサーションは、バージョン1.5で導入されたPythonの最新のキーワードであるassertステートメントによって実行されます。
  • プログラマーは、有効な入力をチェックするために、および有効な出力をチェックするための関数呼び出しの後に、関数の先頭にアサーションを配置することがよくあります。

assertステートメント

assert文が検出されると、Pythonは付随する式を評価しますが、これは正しいことです。 式が偽の場合、Pythonは_AssertionError_例外を発生させます。

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

assert Expression[, Arguments]

アサーションが失敗した場合、PythonはArgumentExpressionをAssertionErrorの引数として使用します。 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スクリプトが例外を発生させた場合、すぐに例外を処理する必要があります。そうでない場合、終了して終了します。

例外処理

例外を発生させる可能性のある_suspicious_コードがある場合は、疑わしいコードを* 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節を提供することもできます。
  • except節の後に、else節を含めることができます。 try:ブロックのコードが例外を発生させない場合、else-blockのコードが実行されます。
  • 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節

また、次のように複数の例外を処理するために同じ_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.

try-finally節

  • finally:ブロックと try:*ブロックを使用できます。 * finally:*ブロックは、tryブロックで例外が発生したかどうかにかかわらず、実行する必要があるコードを配置する場所です。 try-finallyステートメントの構文はこれです-
try:
   You do your operations here;
   ......................
   Due to any exception, this may be skipped.
finally:
   This would always be executed.
   ......................

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

#!/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_ブロックに渡されます。 _finally_ブロック内のすべてのステートメントが実行された後、例外が再度発生し、_try-except_ステートメントの次の上位レイヤーに存在する場合、_except_ステートメントで処理されます。

例外の引数

例外には、_argument_を含めることができます。これは、問題に関する追加情報を提供する値です。 引数の内容は例外によって異なります。 あなたは次のように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

-例外をキャッチするには、「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