什么是異常
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版本中沒有實現
