08-Python異常

Python異常

Python異常思維導圖

1、異常簡介

異常:

  • 當Python檢測到一個錯誤時,解釋器就無法繼續執行了,反而出現了一些錯誤的提示,這就是所謂的"異常

2、捕獲異常

<1>捕獲異常 try…except…

try:
print('-----test--1---') 
open('123.txt','r') 
print('-----test--2---') 
except IOError: 
pass
  • 說明:

    • 此程序看不到任何錯誤,因爲用except 捕獲到了IOError異常,並添加了處理的方法
    • pass 表示實現了相應的實現,但什麼也不做;如果把pass改爲print語句,那麼就會輸出其他信息
  • 小總結:

    • 把可能出現問題的代碼,放在try中
    • 把處理異常的代碼,放在except中

<2> except捕獲多個異常

- #coding=utf-8
try: 
print('-----test--1---') 
open('123.txt','r') # 如果123.txt文件不存在,那麼會產生 IOError 異常 print('-----test--2---') 
print(num)# 如果num變量沒有定義,那麼會產生 NameError 異常
except (IOError,NameError): #如果想通過一次except捕獲到多個異常可以用一個元組的方式# errorMsg裏會保存捕獲到的錯誤信息 
print(errorMsg) 
  • 注意:

    • 當捕獲多個異常時,可以把要捕獲的異常的名字,放到except 後,並使用元組的方式僅進行存儲

<3>獲取異常的信息描述

  • 單個異常
  • 多個異常

<4>捕獲所有異常

  • 沒有基本信息
  • 存儲基本信息

<5> else

try: 
num = 100
print num 
except NameError as errorMsg: 
print('產生錯誤了:%s'%errorMsg) 
else: 
print('沒有捕獲到異常,真高興') 

<6> try…finally…

  • 在程序中,如果一個段代碼必須要執行,即無論異常是否產生都要執行,那麼此時就需要使用finally
  • 比如文件關閉,釋放鎖,把數據庫連接返還給連接池等
 import time 
try: 
f = open('test.txt') 
try: 
whileTrue: 
content = f.readline() 
if len(content) == 0: 
break 
time.sleep(2) 
print(content) 
except TypeError as ex: === catch(NullPointException ex) #如果在讀取文件的過程中,產生了異常,那麼就會捕獲到#比如 按下了 ctrl+c
pass
finally: 
f.close() 
print('關閉文件') 
except: 
print("沒有這個文件") 

3、異常的傳遞

1. try嵌套中

  • 代碼:
 import time 
try: 
f = open('test.txt') 
try: 
while True: 
content = f.readline() 
if len(content) == 0: 
break 
time.sleep(2) 
print(content) 
finally: 
f.close() 
print('關閉文件') 
except: 
print("沒有這個文件") 
  • 運行結果:

import time
…: try:
…: f = open(‘test.txt’)
…: try:
…: while True:
…: content = f.readline()
…: if len(content) == 0:
…: break
…: time.sleep(2)
…: print(content)
…: finally:
…: f.close()
…: print(‘關閉文件’)
…: except:
…: print(“沒有這個文件”)
…: finally:
…: print(“最後的finally”)
…: xxxxxxx—>這是test.txt文件中讀取到信息 ^C關閉文件 沒有這個文件 最後的finally

2. 函數嵌套調用中

def test1(): 
print("----test1-1----") 
print(num) 
print("----test1-2----") 
def test2(): 
print("----test2-1----") 
test1() 
print("----test2-2----") 
def test3():
try: 
print("----test3-1----") 
test1() 
print("----test3-2----") 
except Exception as result: 
print("捕獲到了異常,信息是:%s"%result) 
print("----test3-2----") 
test3() 
print("------華麗的分割線-----") 
test2()

總結:

  • 如果try嵌套,那麼如果裏面的try沒有捕獲到這個異常,那麼外面的try會接收到這個異常,然後進行處理,如果外邊的try依然沒有捕獲到,那麼再進行傳遞。。。
  • 如果一個異常是在一個函數中產生的,例如函數A---->函數B---->函數C,而異常是在函數C中產生的,那麼如果函數C中沒有對這個異常進行處理,那麼這個異常會傳遞到函數B中,如果函數B有異常處理那麼就會按照函數B的處理方式進行執行;如果函數B也沒有異常處理,那麼這個異常會繼續傳遞,以此類推。。。如果所有的函數都沒有處理,那麼此時就會進行異常的默認處理,即通常見到的那樣
  • 注意觀察上圖中,當調用test3函數時,在test1函數內部產生了異常,此異常被傳遞到test3函數中完成了異常處理,而當異常處理完後,並沒有返回到函數test1中進行執行,而是在函數test3中繼續執行

4、自定義異常

你可以用raise語句來引發一個異常。異常/錯誤對象必須有一個名字,且它們應是Error或Exception類的子類

實例:

- class ShortInputException(Exception):'''自定義的異常類'''
def__init__(self, length, atleast):
#super().__init__() 
self.length = length 
self.atleast = atleast 
def main():
try: 
s = input('請輸入 --> ') 
if len(s) < 3: # raise引發一個你定義的異常
raise ShortInputException(len(s), 3) 
except ShortInputException as result:#x這個變量被綁定到了錯誤的實例 print('ShortInputException: 輸入的長度是 %d,長度至少應是 %d'% (result.length, result.atleast)) 
else: 
print('沒有異常發生.') 
main()
  • 注意:

    • 以上程序中,關於代碼#super().init()的說明
    • 這一行代碼,可以調用也可以不調用,建議調用,因爲__init__方法往往是用來對創建完的對象進行初始化工作,如果在子類中重寫了父類的__init__方法,即意味着父類中的很多初始化工作沒有做,這樣就不保證程序的穩定了,所以在以後的開發中,如果重寫了父類的__init__方法,最好是先調用父類的這個方法,然後再添加自己的功能

5、異常處理中拋出異常

classTest(object):
def __init__(self, switch): 
self.switch = switch #開關
def calc(self, a, b):
try: 
return a/b 
except Exception as result: 
if self.switch: 
print("捕獲開啓,已經捕獲到了異常,信息如下:") 
print(result) 
else: #重新拋出這個異常,此時就不會被這個異常處理給捕獲到,從而觸發默認的異常處理
raise 
a = Test(True) 
a.calc(11,0) 
print("----------------------華麗的分割線----------------") 
a.switch = False 
a.calc(11,0)

總結:


try:是異常捕獲開始代碼,try放在特別關心的那段代碼前面

     pass:如果這行代碼出現了異常,那麼後面的代碼不會運行

     pass2

     pass3

 except 異常的類型 as ex: 捕獲某種類型的異常

 except....多個except。按照順序依次比對類型

 else:沒有異常時執行

 finally:不管有沒有異常都會執行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章