Python用異常對象(exception object)來表示異常狀況。遇到錯誤會引起異常,若是異常對象未被處理或者捕捉,程序就會用回溯(traceback)終止執行。html
Raise語句:python
異常能夠在某些東西出錯時自動引起。爲了引起異常有兩種方式:ssh
1.使用一個類,應該是Excepion的子類(使用類時,程序會自動建立類的一個實例) 2.實例參數調用raise語句。
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版本中沒有實現