1. 程式人生 > >Python異常處理try...except的簡單使用

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 :使用者程式碼生成的警告

參考:
https://www.cnblogs.com/Lival/p/6203111.html