《python基礎教程》 --讀書筆記(7)

異常

什麼是異常

python用異常對象(exception object)來表示異常,每一個異常都是一些類的實例,這些實例可以被引發,並且可以用很多種方法進行捕捉並對其進行處理,而不是讓整個程序失效。換句話說如果知道某段代碼可能會導致某種異常,而又不希望程序以棧跟蹤的形式終止,那麼就需要捕捉處理異常

按自己的方式出錯

raise語句
raise語句可以引發異常,它接受異常類或者異常實例作爲參數
一些內建異常

類名 描述
Exception 所有異常的基類
AttributeError 特性引用或賦值失敗時引發
IOError 試圖打開不存在文件時引發
IndexError 在使用序列不存在的索引時引發
KeyError 在使用映射中不存在的鍵時引發
NameError 在找不到名字(變量)時引發
TypeError 在內建操作或者函數應用於錯誤的對象時引發
SyntaxError 在代碼爲錯誤形式時引發

自定義異常類
確保從Exception類繼承

捕捉異常

# 捕捉異常 try/except語句實現
try:
    x = 1
    y = 0
    print(x/y)
except ZeroDivisionError:
    print("The second number can't be zero")

多個except子句

# 捕捉異常 多個except子句
try:
    x = "x"
    y = 0
    print(x/y)
except ZeroDivisionError:
    print("The second number can't be zero")
except TypeError:
    print("That wasn't number")

用塊捕捉多個異常

# 捕捉異常 用塊捕捉多個異常
try:
    x = "x"
    y = 0
    print(x/y)
except (ZeroDivisionError, TypeError):
    print("There's something wrong with your data")

捕捉對象

# 捕捉異常對象
# 可以顯示地捕捉異常對象,能瞭解到發生了什麼,但程序會繼續運行
try:
    x = "x"
    y = 0
    print(x/y)
except (ZeroDivisionError, TypeError) as e:
    print(e)

finally

它可以用來在可能的異常後進行清理,它和try子句聯合使用,finally子句肯定會被執行,,不管try子句中是否發生異常

# finally子句
try:
    x = "x"
    y = 0
    print(x/y)
except (ZeroDivisionError, TypeError) as e:
    print(e)
finally:
    print("Always execute")

異常和函數

如果異常在函數內引發而不被處理,它就會傳播至函數調用的地方,如果在那裏也沒有處理異常,他就會繼續傳播,一直到達主程序。如果那裏沒有異常處理程序,程序就會帶着棧跟蹤終止

# 異常傳遞到調用函數
def faulty():
    raise Exception("Something is wrong")

def ignore():
    faulty()
def handle_exception():
    try:
        faulty()
    except:
        print("Exception handled")
# 異常未被處理,導致棧跟蹤
ignore()
"""
結果展示
Traceback (most recent call last):
  File "D:/pythonspace/pythontest/sequence.py", line 13, in <module>
    ignore()
  File "D:/pythonspace/pythontest/sequence.py", line 6, in ignore
    faulty()
  File "D:/pythonspace/pythontest/sequence.py", line 3, in faulty
    raise Exception("Something is wrong")
"""
# 異常被處理
handle_exception()
# Exception: Something is wrong
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章