Pythonの例外の概要

高洛峰
リリース: 2016-10-20 09:30:26
オリジナル
1375 人が閲覧しました

Python は例外オブジェクトを使用して例外を表します。エラーが発生すると、例外がスローされます。例外オブジェクトが処理されない、またはキャッチされない場合、プログラムはいわゆるトレースバック (エラー メッセージ) で実行を終了します:

>>> 1/0

Traceback (most 最新の呼び出し 最後):

File " "、1 行目、

1/0

ZeroDivisionError: 整数除算またはゼロによるモジュロ

raise ステートメント

例外を発生させるには、クラス (Exception のサブクラス) またはインスタンスを使用して raise を呼び出すことができます。パラメータ番号ステートメント。次の例では、組み込み例外クラスを使用しています:

>>> raise Exception    #引发一个没有任何错误信息的普通异常
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
raise Exception
Exception
>>> raise Exception(&#39;hyperdrive overload&#39;)   # 添加了一些异常错误信息
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
raise Exception(&#39;hyperdrive overload&#39;)
Exception: hyperdrive overload
ログイン後にコピー

システムに付属の組み込み例外クラス:

>>> importExceptions

>>> dir(例外)

[' ArithmeticError'、'AssertionError'、'AttributeError'、'BaseException'、'BufferError'、'BytesWarning'、'DeprecationWarning'、'EOFError'、'EnvironmentError'、'Exception'、'FloatingPointError'、'FutureWarning'、'GeneratorExit' , 'IOError '、'ImportError'、'ImportWarning'、'IndentationError'、'IndexError'、'KeyError'、'KeyboardInterrupt'、'LookupError'、'MemoryError'、'NameError'、'NotImplementedError'、'OSError'、' OverflowError'、'PendingDeprecationWarning'、'ReferenceError'、'RuntimeError'、'RuntimeWarning'、'StandardError'、'StopIteration'、'SyntaxError'、'SyntaxWarning'、'SystemError'、'SystemExit'、'TabError'、'TypeError' 、'UnboundLocalError '、'UnicodeDecodeError'、'UnicodeEncodeError'、'UnicodeError'、'UnicodeTranslateError'、'UnicodeWarning'、'UserWarning'、'ValueError'、'Warning'、'WindowsError'、'ZeroDivisionError'、'__doc__'、' __name__'、'__package__']

すごい!一般的に使用される組み込み例外クラスが多数あります。

カスタム例外

組み込み例外クラスはほとんどの状況をカバーしており、多くの要件には十分ですが、独自の例外クラスを作成する必要がある場合もあります。

他の一般的なクラスと同様に、直接的または間接的に Exception クラスから継承するようにしてください。次のようになります:

>>> class someCustomExcetion(Exception):pass

もちろん、このクラスにいくつかのメソッドを追加することもできます。

例外のキャッチ

try/excel を使用して例外のキャッチと処理を実装できます。

ユーザーが 2 つの数値を入力してそれらを除算できるプログラムを作成するとします。 #どうですか?今回はさらにフレンドリーです

ユーザーとの対話中に例外情報をユーザーに見せたくない場合は、デバッグ中に例外を発生させた方がよいでしょう。 「ブロック」メカニズムをオン/オフにするにはどうすればよいですか?

x = input(&#39;Enter the first number: &#39;)
y = input(&#39;Enter the second number: &#39;)
print x/y
#运行并且输入
Enter the first number: 10
Enter the second number: 0
Traceback (most recent call last):
File "I:/Python27/yichang", line 3, in <module>
print x/y
ZeroDivisionError: integer division or modulo by zero
为了捕捉异常并做出一些错误处理,可以这样写:
try:
x = input(&#39;Enter the first number: &#39;)
y = input(&#39;Enter the second number: &#39;)
print x/y
except ZeroDivisionError:
  print "输入的数字不能为0!"
  
#再来运行
>>>
Enter the first number: 10
Enter the second number: 0
ログイン後にコピー

複数のexcel句

上記のプログラムを実行し(2つの数値を入力して割り算を計算する)、上記の内容を入力すると、別の例外が生成されます:

class MuffledCalulator:
muffled = False   #这里默认关闭屏蔽
def calc(self,expr):
try:
return eval(expr)
except ZeroDivisionError:
if self.muffled:
print &#39;Divsion by zero is illagal&#39;
else:
raise
#运行程序:
>>> calculator = MuffledCalulator()
>>> calculator.calc(&#39;10/2&#39;)
5
>>> calculator.clac(&#39;10/0&#39;)
Traceback (most recent call last):
File "<pyshell#30>", line 1, in <module>
calculator.clac(&#39;10/0&#39;)
AttributeError: MuffledCalulator instance has no attribute &#39;clac&#39;   #异常信息被输出了
>>> calculator.muffled = True   #现在打开屏蔽
>>> calculator.calc(&#39;10/0&#39;)
Divsion by zero is illagal
ログイン後にコピー


OK!この状況を処理する例外ハンドラーを追加できます:

try:
x = input(&#39;Enter the first number: &#39;)
y = input(&#39;Enter the second number: &#39;)
print x/y
except ZeroDivisionError:
  print "输入的数字不能为0!"
  
#运行输入:
>>>
Enter the first number: 10
Enter the second number: &#39;hello.word&#39;  #输入非数字
Traceback (most recent call last):
File "I:\Python27\yichang", line 4, in <module>
print x/y
TypeError: unsupported operand type(s) for /: &#39;int&#39; and &#39;str&#39;  #又报出了别的异常信息
ログイン後にコピー

数字を入力してください!

1 つのブロックで複数の例外をキャッチ

もちろん、1 つのブロックを使用して複数の例外をキャッチすることもできます:

try:
x = input(&#39;Enter the first number: &#39;)
y = input(&#39;Enter the second number: &#39;)
print x/y
except ZeroDivisionError:
print "输入的数字不能为0!"
except TypeError:           # 对字符的异常处理
  print "请输入数字!"
  
#再来运行:
>>>
Enter the first number: 10
Enter the second number: &#39;hello,word&#39;
ログイン後にコピー

"

すべての例外をキャッチ

上記 プログラムを実行した後、次の内容を入力すると

どうすればいいでしょうか? 本当にすべての例外をキャッチするためにコードを使用したい場合は、誤って無視してしまうことがあります。 , その後、Except 句内のすべての例外クラスを無視できます:

try:
x = input(&#39;Enter the first number: &#39;)
y = input(&#39;Enter the second number: &#39;)
print x/y
except (ZeroDivisionError,TypeError,NameError):
print "你的数字不对!
ログイン後にコピー

エラーが発生しました!

End

心配しないでください。ユーザーが誤って間違ったものを入力しました。情報、もう一度参加するチャンスを与えてもらえますか? 負けたときに確実に終了するようにループを追加できます:

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート