ホームページ > バックエンド開発 > Python チュートリアル > Python のエラーと例外の概要

Python のエラーと例外の概要

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-06-16 08:46:27
オリジナル
1035 人が閲覧しました

事先说明哦,这不是一篇关于Python异常的全面介绍的文章,这只是在学习Python异常后的一篇笔记式的记录和小结性质的文章。什么?你还不知道什么是异常,额...

1.Python异常类

Python是面向对象语言,所以程序抛出的异常也是类。常见的Python异常有以下几个,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不用Python了)。

异常 描述
NameError 尝试访问一个没有申明的变量
ZeroDivisionError 除数为0
SyntaxError 语法错误
IndexError 索引超出序列范围
KeyError 请求一个不存在的字典关键字
IOError 输入输出错误(比如你要读的文件不存在)
AttributeError 尝试访问未知的对象属性
ValueError 传给函数的参数类型不正确,比如给int()函数传入字符串形

2. 例外のキャッチ

Python の完全な例外キャッチ ステートメントは次のようになります。

コードをコピー コードは次のとおりです:

try:
try_suite
Exception1,Exception2, を除きます。 ..、引数:
例外スイート
... #その他の例外ブロック
else:
no_Exceptions_detected_suite
finally:
always_execute_suite

うーん...複雑ではないですか?もちろん、例外をキャッチしたい場合は、else ステートメントを完全に破棄する必要はありません。また、finally ステートメントも必要ありません。 Final ステートメントはそのままにしておきます。え、気を失った?さて、一つずつ説明しましょう。

2.1.try...Except... ステートメント

言うまでもなく、try_suite は例外をキャッチするために必要なコードです。キーとなるのは、Except ステートメントです。try がコード セグメント try_suite で例外をキャプチャした後、Except によって処理されます。

Try...Except ステートメントの最も単純な形式は次のとおりです。

コードをコピー コードは次のとおりです:

try:
try_suite
例外:
例外ブロック

上記の else 句の後には、例外や例外パラメータが続かないため、try によってキャッチされた例外は、処理のために、Except 句の例外ブロックに渡されます。特定の例外を処理したい場合、たとえば、ゼロによる除算の例外のみを処理し、他の例外が発生した場合は、それらの例外を処理せずにスローする場合はどうすればよいでしょうか。このとき、例外パラメータをexcel句に渡す必要があります。 ExceptionN は、Exception 節に指定する例外クラスです (例外クラスの表を参照してください)。これは、このタイプの例外が捕捉された場合、この例外節によって処理されることを意味します。例:

コードをコピーします コードは次のとおりです:

try:
try_suite
例外:
例外ブロック

例:

コードをコピー コードは次のとおりです:

>>> try:
... res = 2/ 0
...ZeroDivisionError を除く:
... print "エラー:除数はゼロであってはなりません!"
...
エラー:除数はゼロであってはなりません!

ほら、本当に ZeroDivisionError 例外をキャッチしました!では、複数の例外をキャッチして処理したい場合はどうすればよいでしょうか?方法は 2 つあり、1 つは複数の例外クラス パラメータを 1 つの例外句に渡す方法、もう 1 つは複数の例外句を記述し、各句で処理する例外クラス パラメータを渡す方法です。これら 2 つの用途は組み合わせて使用​​することもできます。例を挙げてみましょう。

コードをコピー コードは次のとおりです:

try:
floatnum = float(raw_input("を入力してください) float:" ))
intnum = int(floatnum)
print 100/intnum
ZeroDivisionError を除く:
print "エラー: 1 以上の float num を入力する必要があります!"
以外 ValueError:
print "エラー: float 数値を入力する必要があります!"

[root@Cherish tmp]# python test.py
float:fjia を入力してください
エラー: float num を入力する必要があります!
[root@Cherish tmp]# python test.py
float:0.9999 を入力してください
エラー:1 以上の float num を入力する必要があります!
[root@Cherish tmp]# python test.py
float:25.091 を入力してください
4

上の例は誰でも一目で理解できるので、これ以上は説明しません。この例外は 1 つの例外、複数の例外、さらにはすべての例外を処理できることを誰もが理解している限り。

例外節の後の引数が何であるかをまだ説明していないことに気づいたかもしれません。心配しないで、聞いてください。この引数は実際には例外クラスのインスタンスであり (インスタンスが何であるか知らないとは言わないでください)、例外コードからの診断情報が含まれています。つまり、例外をキャッチすると、例外クラスのインスタンスを通じて例外に関する詳細情報を取得できます。例:

コードをコピー コードは次のとおりです:

>>> try:
...     1/0
... except ZeroDivisionError,reason:
...     pass
...
>>> type(reason)

>>> print reason
integer division or modulo by zero
>>> reason
ZeroDivisionError('integer division or modulo by zero',)
>>> reason.__class__

>>> reason.__class__.__doc__
'Second argument to a division or modulo operation was zero.'
>>> reason.__class__.__name__
'ZeroDivisionError'

上面这个例子,我们捕获了除零异常,但是什么都没做。那个reason就是异常类ZeroDivisionError的实例,通过type就可以看出。

2.2try ... except...else语句
    现在我们来说说这个else语句。Python中有很多特殊的else用法,比如用于条件和循环。放到try语句中,其作用其实也差不多:就是当没有检测到异常的时候,则执行else语句。举个例子大家可能更明白些:

复制代码 代码如下:

>>> import syslog
>>> try:
...     f = open("/root/test.py")
... except IOError,e:
...     syslog.syslog(syslog.LOG_ERR,"%s"%e)
... else:
...     syslog.syslog(syslog.LOG_INFO,"no exception caught\n")
...
>>> f.close()

2.3 finally子句
    finally子句是无论是否检测到异常,都会执行的一段代码。我们可以丢掉except子句和else子句,单独使用try...finally,也可以配合except等使用。

例如2.2的例子,如果出现其他异常,无法捕获,程序异常退出,那么文件 f 就没有被正常关闭。这不是我们所希望看到的结果,但是如果我们把f.close语句放到finally语句中,无论是否有异常,都会正常关闭这个文件,岂不是很 妙

复制代码 代码如下:

>>> import syslog
>>> try:
...     f = open("/root/test.py")
... except IOError,e:
...     syslog.syslog(syslog.LOG_ERR,"%s"%e)
... else:
...     syslog.syslog(syslog.LOG_INFO,"no exception caught\n")
... finally:
>>>     f.close()

 大家看到了没,我们上面那个例子竟然用到了try,except,else,finally这四个子句!:-),是不是很有趣?到现在,你就基本上已经学会了如何在Python中捕获常规异常并处理之。

3.两个特殊的处理异常的简便方法

3.1断言(assert)
    什么是断言,先看语法:

复制代码 代码如下:

assert expression[,reason]

其中assert是断言的关键字。执行该语句的时候,先判断表达式expression,如果表达式为真,则什么都不做;如果表达式不为真,则抛出异常。reason跟我们之前谈到的异常类的实例一样。不懂?没关系,举例子!最实在!

复制代码 代码如下:

>>> assert len('love') == len('like')
>>> assert 1==1
>>> assert 1==2,"1 is not equal 2!"
Traceback (most recent call last):
  File "", line 1, in
AssertionError: 1 is not equal 2!

我们可以看到,如果assert后面的表达式为真,则什么都不做,如果不为真,就会抛出AssertionErro异常,而且我们传进去的字符串会作为异常类的实例的具体信息存在。其实,assert异常也可以被try块捕获:

复制代码 代码如下:

>>> try:
...     assert 1 == 2 , "1 is not equal 2!"
... except AssertionError,reason:
...     print "%s:%s"%(reason.__class__.__name__,reason)
...
AssertionError:1 is not equal 2!
>>> type(reason)

3.2. コンテキスト管理 (ステートメントあり)
共有リソース (ファイル、データなど) の一意の割り当てを確保するためだけに try、excel、finally のコードを使用し、タスクの終了後に解放する場合は、幸いです。 !この with ステートメントを使用すると、try、excel、finally から解放されます。構文は次のとおりです:

コードをコピー コードは次のとおりです:

with context_expr [as var]:
with_suite

分からないの?それは普通のことです、例を挙げてください!

コードをコピー コードは次のとおりです。

>>> with open('/root/test. py') as f:
... for line in f:
... print line

上記のコード行は何をするのでしょうか?
(1) ファイル /root/test.py を開きます
(2) ファイルオブジェクトを f
に代入します (3) ファイルの全行を出力します
(4) の有無は関係ありませんコード内の例外として、Python がこのファイルを閉じてくれるので、これらの詳細を気にする必要はありません。
さて、with ステートメントを使用してこれらの共有リソースを使用すれば、何らかの理由で解放されないことを心配する必要がないことが理解できましたか。ただし、すべてのオブジェクトが with ステートメントを使用できるわけではありません。コンテキスト管理プロトコルをサポートするオブジェクトだけがこのプロトコルをサポートします。次の表に示すように:
ファイル

10 進数.Context
threading.LockType
threading.Lock
threading.RLock
threading.Condition
threading.Semaphore
threading.BoundedSemaphore

コンテキスト管理プロトコルが何であるかについては、どのように使用するか、どのオブジェクトが使用できるかだけを気にしなければ、この問題はあまり気にしません:)

4. 例外をスローする (レイズ)

作成したプログラムで積極的に例外をスローしたい場合はどうすればよいでしょうか? raise ステートメントは、目標を達成するのに役立ちます。その基本的な構文は次のとおりです:

コードをコピーします コードは次のとおりです:

raise [SomeException [, args [,traceback]]

最初のパラメーター SomeException は例外クラス、または例外クラスのインスタンスである必要があります。
2 番目のパラメーターは SomeException に渡されるパラメーターであり、タプルである必要があります。このパラメータは、この例外に関する有用な情報を渡すために使用されます。
3 番目のパラメーター トレースバックはほとんど使用されません。主に追跡レコード オブジェクト (トレースバック) を提供するために使用されます。
以下にいくつかの例を示します。

コードをコピー コードは次のとおりです:

>>> raise NameError
Traceback (最新) call last) :
ファイル ""、1 行目、
NameError
>>> raise NameError() #例外クラスのインスタンス
Traceback (最新の呼び出し last):
ファイル ""、1 行目、
NameError
>>> raise NameError,("名前エラーがあります", "in test .py")
トレースバック (最新の呼び出しは最後):
ファイル ""、
> の行 1、
>>>> raise NameError(" There is a name error","in test.py") #上記の例との違いに注意してください
Traceback (most last call last):
File "", line 1, in < module>
NameError: ('名前エラーがあります', 'test.py')
>>> raise NameError,NameError("名前エラーがあります", "test.py ") # 上記の例との違いに注意してください
Traceback (most last call last):
File "", line 1, in
NameError: ('名前エラー' 、'test.py 内')

実際、最も一般的に使用されるのは、例外の種類を示す最初のパラメーターのみを渡し、説明情報を与えるために最大 1 つのタプルを渡すことです。上の 3 番目の例のように。

5. 例外と sys モジュール

例外情報を取得するもう 1 つの方法は、sys モジュールの exc_info() 関数を使用することです。この関数はトリプルを返します: (例外クラス、例外クラスのインスタンス、その後にレコード オブジェクト)

コードをコピー コードは次のとおりです:

>>> try:
... 1/0
... 例外:
... import sys
... タプル = sys.exc_info ()
...
>>> print tuple
(, ZeroDivisionError('整数除算またはゼロによる剰余',), )
>>> for i in tuple:
... print i
...
🎜>整数の除算またはゼロによるモジュロ #Exception クラス インスタンス
<0x7f538a318b48 のトレースバック オブジェクト> #Traceback オブジェクト

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