Pythonの例外概念の紹介と処理

1.例外処理とは

定義:例外処理は、Pythonの作成時によく見られるエラーメッセージです。たとえば、NameError、TypeError、ValueErrorなどです。これらはすべて例外です。

例外はイベントです。変更イベントはプログラムの実行中に発生し、プログラムの通常の実行に影響します。通常の状況では、プログラムをpythonで処理できない場合に例外が発生します。例外がPythonのオブジェクトである場合、エラーを表します。スクリプトで例外が発生した場合、例外をキャッチして処理する必要があります。そうしないと、プログラムは実行を終了します。

2、例外処理

Pythonスクリプトに例外がある場合はどうすればよいですか?

私たちが使っているツールに少し問題があるのと同じように、それを修正する方法を見つけることができ、プログラムは同じです。継続的な蓄積と思考の結果、前任者はプログラムの異常に対処するための多くの優れた方法を作成しました。この章では、 tryステートメントを使用して例外を処理する方法について説明します。

まず、tryステートメントの構文について説明しましょう。

tryステートメントはexceptと組み合わせて使用されます。このステートメントは、tryステートメントブロック内のエラーを検出して、exceptステートメントが例外情報をキャプチャして処理できるようにするために使用されます。例外が発生したときにプログラムを終了したくない場合は、tryステートメントで例外をキャッチするだけで済みます。

try:
< コードブロック
except <例外名
print(&#39;ステートメント')
例は次のとおりです。
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( &#39;例外の説明')
except <例外名:
print( &#39;例外の説明')
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 ユーザーコードによって生成された警告

Recommended Posts

Pythonの例外概念の紹介と処理
Pythonの例外処理
Ubuntuの紹介とインストール
Anacondaの紹介とUbuntu / windowsのインストールAnaconda
Pythonの歴史、長所と短所
Pythonのグローバル変数とローカル変数
Pythonの一般的な例外処理メカニズム