Python-例外処理
前のページ次のページ
Python は、Python プログラムの予期しないエラーを処理し、デバッグ機能を追加するための 2 つの非常に重要な機能を提供します −
-
例外処理 − これについては、このチュートリアルで説明します。 Python で利用可能な標準例外のリストを次に示します:標準例外。
-
主張 − これについては、Assertions in Python チュートリアルで説明します。
標準例外のリスト −
Sr.No. | 例外の名前と説明 |
---|---|
1 | 例外 すべての例外の基本クラス |
2 | 反復停止 イテレータの next() メソッドがどのオブジェクトも指していない場合に発生します。 |
3 | システム終了 sys.exit() 関数によって発生します。 |
4 | 標準エラー StopIteration と SystemExit を除くすべての組み込み例外の基本クラス。 |
5 | 算術エラー 数値計算で発生するすべてのエラーの基本クラス。 |
6 | オーバーフロー エラー 計算が数値型の上限を超えたときに発生します。 |
7 | FloatingPointError 浮動小数点計算が失敗したときに発生します。 |
8 | ZeroDivisionError すべての数値型に対してゼロによる除算またはモジュロが行われたときに発生します。 |
9 | アサーションエラー Assert ステートメントが失敗した場合に発生します。 |
10 | 属性エラー 属性の参照または割り当てに失敗した場合に発生します。 |
11 | EOFエラー raw_input() または input() 関数からの入力がなく、ファイルの終わりに達したときに発生します。 |
12 | インポートエラー import ステートメントが失敗したときに発生します。 |
13 | キーボード割り込み ユーザーが通常 Ctrl+c を押してプログラムの実行を中断したときに発生します。 |
14 | 検索エラー すべてのルックアップ エラーの基本クラス。 |
15 | インデックスエラー シーケンス内にインデックスが見つからない場合に発生します。 |
16 | キーエラー 指定されたキーが辞書にない場合に発生します。 |
17 | 名前エラー ローカルまたはグローバル名前空間で識別子が見つからない場合に発生します。 |
18 | UnboundLocalError 関数またはメソッドでローカル変数にアクセスしようとしたが、値が割り当てられていない場合に発生します。 |
19 | 環境エラー Python 環境外で発生するすべての例外の基本クラス。 |
20 | IOエラー 存在しないファイルを開こうとしたときの print ステートメントや open() 関数など、入出力操作が失敗したときに発生します。 |
21 | IOエラー オペレーティング システム関連のエラーで発生します。 |
22 | 構文エラー Python 構文にエラーがある場合に発生します。 |
23 | インデントエラー インデントが適切に指定されていない場合に発生します。 |
24 | システムエラー インタープリターが内部の問題を検出したときに発生しますが、このエラーが発生した場合、Python インタープリターは終了しません。 |
25 | システム終了 sys.exit() 関数を使用して Python インタープリターが終了したときに発生します。コードで処理されない場合、インタープリターが終了します。 |
26 | TypeError 指定されたデータ型に対して無効な操作または関数が試行されたときに発生します。 |
27 | ValueError データ型の組み込み関数に有効な型の引数があるが、引数に無効な値が指定されている場合に発生します。 |
28 | 実行時エラー 生成されたエラーがどのカテゴリにも該当しない場合に発生します。 |
29 | NotImplementedError 継承されたクラスで実装する必要がある抽象メソッドが実際には実装されていない場合に発生します。 |
Python でのアサーション
アサーションは、プログラムのテストが完了したときにオンまたはオフにできるサニティ チェックです。
アサーションを考える最も簡単な方法は、それを raise-if に例えることです ステートメント (より正確には、raise-if-not ステートメント)。式がテストされ、結果が false の場合、例外が発生します。
アサーションは、バージョン 1.5 で導入された Python の最新のキーワードである assert ステートメントによって実行されます。
プログラマーは、有効な入力をチェックするために関数の開始時にアサーションを配置し、有効な出力をチェックするために関数呼び出しの後に配置することがよくあります。
アサート 声明
assert ステートメントに遭遇すると、Python はそれに付随する式を評価します。これは真であることが期待されます。式が false の場合、Python は AssertionError を発生させます
構文 for assert is −
assert Expression[, Arguments]
アサーションが失敗した場合、Python は ArgumentExpression を AssertionError の引数として使用します。 AssertionError 例外は、try-except ステートメントを使用して他の例外と同様にキャッチして処理できますが、処理されない場合、プログラムが終了し、トレースバックが生成されます。
例
これは、温度をケルビン度から華氏度に変換する関数です。ケルビン 0 度は非常に寒いため、負の温度が検出された場合、関数は救済されます −
ライブデモ#!/usr/bin/python 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 句を提供することもできます。
-
except 句の後に、else 句を含めることができます。 try:ブロック内のコードが例外を発生させない場合、else-block 内のコードが実行されます。
-
else ブロックは、try:ブロックの保護を必要としないコードに適しています。
例
この例では、ファイルを開き、ファイルにコンテンツを書き込み、まったく問題がないため、正常に出力されます −
ライブデモ#!/usr/bin/python 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/python 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.
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. ......................
else は使用できません 句とfinally 句を一緒に使用します。
例
ライブデモ#!/usr/bin/python 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"
ファイルを書き込みモードで開く権限がない場合、次の結果が生成されます −
Error: can't find file or read data
同じ例は、次のようにもっときれいに書くことができます-
ライブデモ#!/usr/bin/python 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"
try で例外がスローされた場合 ブロック、実行はすぐに finally に渡されます ブロック。 finally のすべてのステートメントの後 ブロックが実行されると、例外が再び発生し、except で処理されます try-except の次の上位層に存在する場合のステートメント
例外の引数
例外は引数を持つことができます 、これは問題に関する追加情報を提供する値です。引数の内容は、例外によって異なります。次のように、except 句に変数を指定して、例外の引数を取得します −
try: You do your operations here; ...................... except ExceptionType, Argument: You can print value of Argument here...
単一の例外を処理するコードを作成する場合は、except ステートメントで例外の名前の後に変数を指定できます。複数の例外をトラップしている場合は、変数を例外のタプルの後に置くことができます。
この変数は、主に例外の原因を含む例外の値を受け取ります。変数は、タプルの形式で単一の値または複数の値を受け取ることができます。このタプルには通常、エラー文字列、エラー番号、およびエラーの場所が含まれます。
例
以下は、単一の例外の例です-
ライブデモ#!/usr/bin/python # Define a function here. def temp_convert(var): try: return int(var) except ValueError, 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]]]
ここで、例外 例外のタイプ (NameError など) と argument です。 例外引数の値です。引数はオプションです。指定しない場合、例外引数は None です。
最後の引数である traceback もオプションで (実際にはほとんど使用されません)、存在する場合は、例外に使用される traceback オブジェクトです。
例
例外は、文字列、クラス、またはオブジェクトです。 Python コアが発生させる例外のほとんどは、クラスのインスタンスである引数を持つクラスです。新しい例外の定義は非常に簡単で、次のように実行できます −
def functionName( level ): if level < 1: raise "Invalid level!", level # The code below to this would not be executed # if we raise the exception
注: 例外をキャッチするには、"except" 句で、クラス オブジェクトまたは単純な文字列のいずれかでスローされた同じ例外を参照する必要があります。たとえば、上記の例外をキャプチャするには、except 句を次のように記述する必要があります −
try: Business Logic here... except "Invalid level!": Exception handling here... else: Rest of the code here...
ユーザー定義の例外
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
Python