Python異常處理try...except的簡單使用
1. try…except
有時候我們寫程式的時候,會出現一些錯誤或異常,導致程式終止。使用try…except,這樣程式就不會因為異常而中斷。把可能發生錯誤的語句放在try模組裡,用except來處理異常。except可以處理一個專門的異常,也可以處理一組圓括號中的異常,如果except後沒有指定異常,則預設處理所有的異常。每一個try,都必須至少有一個except。
a=10
b=0
try:
c=a/b
print (c)
except ZeroDivisionError as e:
print (e)
print ("done")
執行:
division by zero done
可以看出在有異常的情況下,程式依然執行完畢。
2. try …except…else
try …except…else語句,當沒有異常發生時,else中的語句將會被執行。
a=10
b=0
try:
c = b/ a
print (c)
except (IOError ,ZeroDivisionError) as x:
print (x)
else:
print ("no error")
print ("done")
執行:
0.0
no error
done
3. raise 引發一個異常
raise是引發一個異常來檢查某個條件是否成立。
inputValue=4.2
if type(inputValue)!=type(1):
raise ValueError
else:
print (inputValue)
執行:
...
raise ValueError
ValueError
4. try …finally
無論異常是否發生,在程式結束前,finally中的語句都會被執行。
a=10
b=0
try:
print (a/b)
finally:
print ("always excute")
執行:
always excute
Traceback ( most recent call last):
...
print (a/b)
ZeroDivisionError: division by zero
可以看出finally最終執行,異常也照常報錯。
5. try …except…finally
a=10
b=0
try:
print (a/b)
except:
print("error")
finally:
print ("always excute")
結果:
error
always excute
6. 自定義一個異常類
自定義一個MyException類,繼承Exception。
class MyException(Exception):
def __init__(self,message):
Exception.__init__(self)
self.message=message
a=9
if a<10:
try:
raise MyException("my excepition is raised ")
except MyException as e:
print (e.message)
結果:
my excepition is raised
7. 把異常儲存到一個日誌檔案中,來分析這些異常:
import traceback
try:
print ('here1:',5/2)
print ('here2:',10/5)
print ('here3:',10/0)
except Exception as e:
f=open("log.txt",'a')
#traceback.print_exc(file=f) # 列印輸出到螢幕
traceback.print_exc(file=f) # 輸出到檔案
f.flush()
f.close()
結果:
here1: 2.5
here2: 2.0
會生成一個log.txt
的檔案。
8. 捕獲異常的小方法
方法一:捕獲所有異常
a=10
b=0
try:
print (a/b)
except Exception as e:
print(Exception,":",e)
finally:
print ("always excute")
執行:
<class 'Exception'> : division by zero
always excute
方法二:採用traceback模組檢視異常
import traceback
try:
print ('here1:',5/2)
print ('here2:',10/5)
print ('here3:',10/0)
except Exception as e:
traceback.print_exc()
執行:
here1: 2.5
here2: 2.0
Traceback (most recent call last):
File "/Users/lilong/Desktop/online_release/try_except_use.py", line 59, in <module>
print ('here3:',10/0)
ZeroDivisionError: division by zero
方法三:採用sys模組回溯最後的異常
import sys
try:
print ('here1:',5/2)
print ('here2:',10/5)
print ('here3:',10/0)
except Exception as e:
info=sys.exc_info()
print (info[0],":",info[1])
執行:
here1: 2.5
here2: 2.0
<class 'ZeroDivisionError'> : division by zero
注意:萬能異常Exception
被檢測的程式碼塊丟擲的異常有多種可能性,並且我們針對所有的異常型別都只用一種處理邏輯就可以了,那就使用Exception,除非要對每一特殊異常進行特殊處理。
9. python所有的標準異常類:
異常名稱 描述
BaseException:所有異常的基類
SystemExit: 直譯器請求退出
KeyboardInterrupt: 使用者中斷執行(通常是輸入^C)
Exception: 常規錯誤的基類
StopIteration: 迭代器沒有更多的值
GeneratorExit: 生成器(generator)發生異常來通知退出
SystemExit Python :直譯器請求退出
StandardError :所有的內建標準異常的基類
ArithmeticError :所有數值計算錯誤的基類
FloatingPointError :浮點計算錯誤
OverflowError :數值運算超出最大限制
ZeroDivisionError :除(或取模)零 (所有資料型別)
AssertionError: 斷言語句失敗
AttributeError: 物件沒有這個屬性
EOFError: 沒有內建輸入,到達EOF 標記
EnvironmentError :作業系統錯誤的基類
IOError: 輸入/輸出操作失敗
OSError :作業系統錯誤
WindowsError :系統呼叫失敗
ImportError :匯入模組/物件失敗
KeyboardInterrupt: 使用者中斷執行(通常是輸入^C)
LookupError :無效資料查詢的基類
IndexError: 序列中沒有沒有此索引(index)
KeyError: 對映中沒有這個鍵
MemoryError: 記憶體溢位錯誤(對於Python 直譯器不是致命的)
NameError :未宣告/初始化物件 (沒有屬性)
UnboundLocalError :訪問未初始化的本地變數
ReferenceError :弱引用(Weak reference)試圖訪問已經垃圾回收了的物件
RuntimeError: 一般的執行時錯誤
NotImplementedError: 尚未實現的方法
SyntaxError Python: 語法錯誤
IndentationError: 縮排錯誤
TabError Tab :和空格混用
SystemError: 一般的直譯器系統錯誤
TypeError :對型別無效的操作
ValueError: 傳入無效的引數
UnicodeError Unicode: 相關的錯誤
UnicodeDecodeError Unicode: 解碼時的錯誤
UnicodeEncodeError Unicode :編碼時錯誤
UnicodeTranslateError Unicode: 轉換時錯誤
Warning: 警告的基類
DeprecationWarning :關於被棄用的特徵的警告
FutureWarning :關於構造將來語義會有改變的警告
OverflowWarning :舊的關於自動提升為長整型(long)的警告
PendingDeprecationWarning :關於特性將會被廢棄的警告
RuntimeWarning :可疑的執行時行為(runtime behavior)的警告
SyntaxWarning :可疑的語法的警告
UserWarning :使用者程式碼生成的警告