python3 異常處理

什麼是異常

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

Raise語句:python

異常能夠在某些東西出錯時自動引起。爲了引起異常有兩種方式:ssh

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類繼承,直接或者間接均可以(能夠是其餘內建異常類的子類),編寫一個自定義異常類以下:spa

#!/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))

 

 

 結果:3d

/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 處理異常的區別:code

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版本中沒有實現 
相關文章
相關標籤/搜索