python3 異常處理


什么是異常

Python用異常對象(exception object)來表示異常情況。遇到錯誤會引發異常,如果異常對象未被處理或者捕捉,程序就會用回溯(traceback)終止執行。

Raise語句:

異常可以在某些東西出錯時自動引發。為了引發異常有兩種方式:

1.使用一個類,應該是Excepion的子類(使用類時,程序會自動創建類的一個實例)
2.實例參數調用raise語句。

實例(使用內建Exception異常類):

In [1]: raise Exception ---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-1-fca2ab0ca76b> in <module>()
----> 1 raise Exception

Exception: 
#raise Exception 引發一個沒有任何有關錯誤信息的普通異常。
In [2]: raise Exception('The Hyperdrive overload') ---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-2-3d981203beac> in <module>()
----> 1 raise Exception('The Hyperdrive overload')

Exception: The Hyperdrive overload
#添加了錯誤信息

內建異常類:

內建異常類很多,都在exceptions模塊中。官網手冊(3.5.1版本),在3.5.1+中,被集成在內置模塊中。

id 類名 描述
1 raise Exception 所有異常的基類
2 raise AttributeError 特征引用或者賦值失敗時引發的
3 raise IOError 試圖打在不存在的文件(包括其他情況)
4 raise IndexError 使用序列中不存在的索引
5 raise KeyError 使用映射中不存在的鍵
6 raise NameError 找不到名字(變量)
7 raise SyntaxError 在代碼為錯誤形式時引發
8 raise TypeError 在內建操作或者函數應用與錯誤類型的對象時
9 raise ValueError 正確的類型對象,但是對象使用不合適的值
10 raise ZeroDivisionError 除法,第二參數為0

自定義異常類:

確保從Exception類繼承,直接或者間接都可以(可以是其他內建異常類的子類),編寫一個自定義異常類如下:

#!/usr/bin/env python
# encoding: utf-8
"""
@author: kamil.liu @file: exception.py
@time: 16-5-30 上午10:56
"""
# raise Exception
# raise AttributeError
# raise IOError
# raise IndexError
# raise KeyError
# raise NameError
# raise SyntaxError
# raise TypeError
# raise ValueError
# raise ZeroDivisionError
class kamilException(Exception):
    pass
print(type(kamilException))
print(dir(kamilException))

 

 

 結果:

/usr/bin/python3.5 /home/kamil/PycharmProjects/untitled/test1/exception.py
<class 'type'>
['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', '__weakref__', 'args', 'with_traceback']

Process finished with exit code 0

 python2 python3 處理異常的區別:

1.所以異常都從 BaseException繼承,並刪除了StardardError 
2.去除了異常類的序列行為和.message屬性 
3.用 raise Exception(args)代替 raise Exception, args語法 
4.捕獲異常的語法改變,引入了as關鍵字來標識異常實例,在Py2中: 
    >>> try: 
    ...    raise NotImplementedError('Error') 
    ... except NotImplementedError, error:

    ...    print error.message 
    ... 
    Error 
在Py3中: 
    >>> try: 
          raise NotImplementedError('Error') 
        except NotImplementedError as error: #注意這個 as 
          print(str(error)) 
    Error 
5.異常鏈,因為__context__在3.0a1版本中沒有實現 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM