例外捕獲
常見例外型別
Exception:頂級例外類,大部分例外類都是它的子類,
SyntaxError:語法錯誤
TypeError:型別錯誤
ValueError:值錯誤
NameError:找不到名稱,比如變數名
IndexError:找不到索引,在序列中取值時出現
KeyError:映射中不存在鍵名,在字典中取一個不存在的key時出現
ZeroDivisionError:除法中除數為0時出現
FileNotFoundError:找不到檔案錯誤
捕獲指定例外
例外捕獲的寫法結構是try-except,下面模擬一個除數為0的例外,
a = 10 b = 0 try: result = a / b print(f"結果是:{result}") except ZeroDivisionError: print('除數不能為0')
列印結果:
除數不能為0
我們雖然捕獲了ZeroDivisionError,但是也可能出現其他例外,比如a和b不是數字呢?那么我們如果想單獨對每一種例外都進行精確捕獲與提示的話,可以多寫幾個except,針對性處理,
a = 10 b = 'abc' try: result = a / b print(f"結果是:{result}") except ZeroDivisionError: print('除數不能為0') except TypeError: print('型別錯誤')
列印結果:
型別錯誤
如果想多個例外統一處理,也可以同時捕獲多個例外,
a = 10 b = 'abc' try: result = a / b print(f"結果是:{result}") except (ZeroDivisionError,TypeError) as e: print(e)
列印結果:
unsupported operand type(s) for /: 'int' and 'str'
捕獲所有例外
捕獲所有例外是最省心的做法,你不用去糾結到底這段代碼可能會出現哪些例外,
a = 10 b = 'abc' try: result = a / b print(f"結果是:{result}") except: print('出現例外了') 列印結果: 出現例外了
主動拋出例外
raise陳述句對標java和PHP中的throw,作用是拋出例外,
a = 10 b = 0 try: if b == 0 : raise Exception('竟然是0!') result = a / b print(f"結果是:{result}") except Exception as e: print(f'出現例外了:{e}')
列印結果:
出現例外了:竟然是0!
raise不僅可以在try-except陳述句塊里面用,也可以在全域使用,在try-except里面拋出例外,會被except捕獲,如果在沒有try-except代碼中使用的話,例外就會向上傳遞,傳給呼叫方,直到傳到主程式全域空間,然后停止程式運行,列印出堆疊跟蹤資訊,
未發生例外時
try-except陳述句還可以包含else代碼塊,讓我們可以像條件判斷一樣進行例外處理,如果出現例外怎么辦,如果沒有例外又怎么辦,
a = 10 b = 2 try: if b == 0 : raise Exception('竟然是0!') result = a / b print(f"結果是:{result}") except Exception as e: print(f'出現例外了:{e}') else: print('程式一切正常')
列印結果:
結果是:5.0
程式一切正常
掃尾作業
try-except還有一個finally代碼塊,無論是否例外都一定會執行finally代碼塊中的代碼,比如打開檔案之后做一些業務處理,無論程序是否出現例外,都必須要關閉檔案,那么關閉檔案的操作就應該放在finally代碼塊中,
a = 10 b = 0 try: if b == 0 : raise Exception('竟然是0!') result = a / b print(f"結果是:{result}") except Exception as e: print(f'出現例外了:{e}') else: print('程式一切正常') finally: print('掃尾作業清理')
列印結果:
出現例外了:竟然是0!
掃尾作業清理
自定義例外
自定義例外類需要繼承Exception類,直接繼承或間接繼承都可以,
class MyError(Exception): pass try: raise MyError('隨便拋') except MyError as e: print(f'捕獲到了自定義例外:{e}')
列印結果:
捕獲到了自定義例外:隨便拋
如果你愿意,也可以在自定義例外類中覆寫父類的建構式,或者添加方法都可以,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/83331.html
標籤:Python
上一篇:解決IDEA/pycharm提示Untrusted Server's certificate 證書不可用( Server's certificate is not trusted )
