1.例外処理とは
定義:例外処理は、Pythonの作成時によく見られるエラーメッセージです。たとえば、NameError、TypeError、ValueErrorなどです。これらはすべて例外です。
例外はイベントです。変更イベントはプログラムの実行中に発生し、プログラムの通常の実行に影響します。通常の状況では、プログラムをpythonで処理できない場合に例外が発生します。例外がPythonのオブジェクトである場合、エラーを表します。スクリプトで例外が発生した場合、例外をキャッチして処理する必要があります。そうしないと、プログラムは実行を終了します。
2、例外処理
Pythonスクリプトに例外がある場合はどうすればよいですか?
私たちが使っているツールに少し問題があるのと同じように、それを修正する方法を見つけることができ、プログラムは同じです。継続的な蓄積と思考の結果、前任者はプログラムの異常に対処するための多くの優れた方法を作成しました。この章では、 tryステートメントを使用して例外を処理する方法について説明します。
まず、tryステートメントの構文について説明しましょう。
tryステートメントはexceptと組み合わせて使用されます。このステートメントは、tryステートメントブロック内のエラーを検出して、exceptステートメントが例外情報をキャプチャして処理できるようにするために使用されます。例外が発生したときにプログラムを終了したくない場合は、tryステートメントで例外をキャッチするだけで済みます。
try:
< コードブロック
except <例外名
print('ステートメント')
例は次のとおりです。
def func():try:
a = x/y
print('a=',a)return a
eccept Exception:print('プログラムは異常であり、異常な情報:配当は0です')
3、例外をスローします
例外を発生させるために、クラスまたはインスタンスパラメータを指定してraiseステートメントを呼び出すことができます。
例は次のとおりです。
classEvaException(BaseException):
def __init__(self,msg):
self.msg=msg
def __str__(self):return self.msg
try:
raise EvaException('タイプエラー')
except EvaException as e:print(e)
4、複数の例外をキャッチ
異常な状況に対処する方法について話しましたが、複数ある場合はどのように対処すればよいですか?
Pythonでは、複数の例外を処理するためにtry / exceptステートメントがサポートされています。構文は次のとおりです。
try:<ステートメント
except <例外名:
print( '例外の説明')
except <例外名:
print( '例外の説明')
tryステートメントは次のように機能します。
try内のステートメントブロックが初めて実行されます。例外が発生しない場合、exceptの単語は無視され、tryステートメント内のコードブロックは実行後に終了します。 tryステートメントのコードブロックが異常である場合、tryの残りのステートメントは無視されます。
例外名がecceptの例外名と同じである場合、対応するexceptステートメントが実行されます。例外が一致しない場合、例外は上位のtryステートメントに渡されます。ステートメントには、最初のexceptステートメントが含まれる場合があります。
さまざまな例外を個別に処理しますが、実行されるブランチは最大で1つだけです。
try:
# a
#1 /0
dic ={1:2}
dic[3]
except NameError:print('名前が定義されていません、エラーが報告されます')
except ZeroDivisionError:print('0は除数として使用できません。エラーが報告されます')
except KeyError:print('このキーはありません')
5、異常その他
プログラムが異常実行された後に他のことをしたい場合はどうなりますか?
現時点では、例外でelseを使用できます。具体的な構文は次のとおりです。
try:<ステートメント
except <例外名:
< ステートメント
except <例外名:
< ステートメント
else:
< ステートメント#(tryステートメントに例外がない場合にこのコードを実行します)
tryステートメントで例外が発生しない場合、elseステートメントが実行されます。tryステートメントにすべてのステートメントを配置するよりもelseステートメントを使用することをお勧めします。これにより、次の場合を除いてキャッチされない予期しない例外を回避できます。
def func(x,y):try:
a = x/y
except :print('Error,happened')else:print('It went as execpt')func(2,1)
6つのユーザー定義の例外
新しい例外クラスを作成することにより、独自の例外を設定できます。例外は、直接または間接的に、Exceptionクラスから継承する必要があります。次に例を示します。
classMyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):returnrepr(self.value)try:
raise MyError(2*2)
except MyError as e:print('My exception occurred, value:', e.value)
My exception occurred, value:4
raise MyError('oops!')Traceback(most recent call last):
File "<stdin ", line 1,in?
main__.MyError:'oops!'
この例では、デフォルトのクラスException__init__()覆われています。
モジュールを作成するとさまざまな例外がスローされる可能性がある場合、一般的な方法は、パッケージの基本的な例外クラスを作成してから、この基本クラスに基づいてさまざまなエラー条件に対してさまざまなサブクラスを作成することです。:classError(Exception):"""Base class for exceptions in this module."""
pass
classInputError(Error):"""Exception raised for errors in the input.
Attributes:
expression -- input expression in which the error occurred
message -- explanation of the error
"""
def __init__(self, expression, message):
self.expression = expression
self.message = message
classTransitionError(Error):"""Raised when an operation attempts a state transition that's not
allowed.
Attributes:
previous -- state at beginning of transition
next -- attempted newstate
message -- explanation of why the specific transition is not allowed
"""
def __init__(self, previous, next, message):
self.previous = previous
self.next = next
self.message = message
異常な名前のほとんどはで始まります"Error"最後に、標準の例外の命名と同じように。
7、クリーンアップ動作を定義します(最後にステートメント)
tryステートメントには、任意の状況で実行されるクリーンアップ動作を定義する別のオプションの句があります。例えば:
try:... raise KeyboardInterrupt
... finally:...print('Goodbye, world!')...
Goodbye, world!Traceback(most recent call last):
File "<stdin ", line 2,in<module
KeyboardInterrupt
上記の例では、try句で例外が発生するかどうかに関係なく、finally句が実行されます。
try句(またはexcept句とelse句)で例外がスローされ、それをインターセプトする以外に例外がない場合、finally句が実行された後に例外が再度スローされます。
以下は、より複雑な例です(同じtryステートメントにexcept句とfinally句が含まれています):
def divide(x, y):try:
result = x / y
except ZeroDivisionError:print("division by zero!")else:print("result is", result)finally:print("executing finally clause")divide(2,1)
result is 2.0
executing finally clause
divide(2,0)
division by zero!
executing finally clause
divide("2","1")
executing finally clause
Traceback(most recent call last):
File "<stdin ", line 1,in?
File "<stdin ", line 3,in divide
TypeError: unsupported operand type(s)for/:'str' and 'str'
事前定義されたクリーンアップ動作
一部のオブジェクトは、システムが正常に使用したかどうかに関係なく、標準のクリーンアップ動作を定義します。不要になると、この標準のクリーンアップ動作が実行されます。
この例は、ファイルを開いてからコンテンツを画面に出力する試みを示しています。:for line inopen("myfile.txt"):print(line, end="")
上記のコードの問題は、実行が完了すると、ファイルが開いたままになり、閉じられないことです。
キーワードwithステートメントを使用すると、ファイルなどのオブジェクトが使い果たされた後でも正しく実行されるようになります。:withopen("myfile.txt")as f:for line in f:print(line, end="")
上記のコードを実行した後、処理に問題があったとしても、ファイルfは常に閉じられます。
Python標準例外
例外名 | 説明 |
---|---|
BaseException | すべての例外の基本クラス |
SystemExit | 終了するインタープリターリクエスト |
KeyboardInterrupt | ユーザー割り込みの実行(通常は^ Cを入力) |
例外 | 一般的なエラーの基本クラス |
StopIteration | Iteratorに値がありません |
GeneratorExit | 終了を通知するためにジェネレーターで例外が発生します |
StandardError | すべての組み込み標準例外の基本クラス |
ArithmeticError | すべての数値計算エラーの基本クラス |
FloatingPointError | 浮動小数点計算エラー |
OverflowError | 数値演算が上限を超えています |
ZeroDivisionError | 分割(またはモジュロ)ゼロ(すべてのデータタイプ) |
AssertionError | アサーションステートメントが失敗しました |
AttributeError | オブジェクトにはこの属性がありません |
EOFError | 組み込み入力がなく、EOFマークに達しました |
EnvironmentError | オペレーティングシステムエラーの基本クラス |
IOError | 入力/出力操作に失敗しました |
OSError | オペレーティングシステムエラー |
WindowsError | システム呼び出しに失敗しました |
ImportError | モジュール/オブジェクトのインポートに失敗しました |
LookupError | 無効なデータクエリの基本クラス |
IndexError | シーケンスにそのようなインデックスはありません(インデックス) |
KeyError | キーがマップにありません |
MemoryError | メモリオーバーフローエラー(Pythonインタープリターにとって致命的ではありません) |
NameError | オブジェクトが宣言/初期化されていません(属性なし) |
UnboundLocalError | 初期化されていないローカル変数へのアクセス |
ReferenceError | ガベージコレクションされたオブジェクトにアクセスしようとする弱い参照 |
RuntimeError | 一般的なランタイムエラー |
NotImplementedError | メソッドはまだ実装されていません |
SyntaxError | Python構文エラー |
IndentationError | インデントエラー |
TabError | タブとスペースが混在しています |
SystemError | 一般的なインタープリターシステムエラー |
TypeError | タイプの無効な操作 |
ValueError | 無効なパラメータが渡されました |
UnicodeError | ユニコード関連のエラー |
UnicodeDecodeError | ユニコードデコードエラー |
UnicodeEncodeError | ユニコードエンコーディング時間エラー |
UnicodeTranslateError | ユニコード変換エラー |
警告 | 警告の基本クラス |
DeprecationWarning | 非推奨の機能に関する警告 |
FutureWarning | 構造の将来のセマンティック変更に関する警告 |
OverflowWarning | 長整数への自動昇格に関する古い警告 |
保留中DeprecationWarning | 機能に関する警告は非推奨になります |
RuntimeWarning | 疑わしいランタイム動作の警告 |
SyntaxWarning | 疑わしい構文警告 |
UserWarning | ユーザーコードによって生成された警告 |