国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python編程中的異常處理教程

2019-11-25 17:04:56
字體:
來源:轉載
供稿:網友

1、異常簡介
從軟件方面來說,錯誤是語法或是邏輯上的,當python檢測到一個錯誤時,解釋器就會指出當前流已經無法繼續執行下去,這時候就出現了異常。異常分為兩個階段:首先是引起異常發生的錯誤,然后是檢測和采取可能的措施。常見異常有
NameError、ZeroDivisionError、SyntaxError、IndexError、KeyError、IOError、AttributeError、ValueError、
TypeError等。所有的標準/內建異常都是從根異常派生的,目前,有3個直接從BaseException派生的異常子類:SystemExit,KeyboardInterrupt和Exception。其它的所有的內建異常都是Exception的子類。
2、異常檢測及處理
異常可以通過try語句來檢測,有兩種主要形式:try-except和try-finally。前者可以添加一個可選的else子句來處理沒有檢測到異常的情況。一個try語句可以對應一個或多個except語句,但只能對應一個finally子句,except用來捕獲并處理異常,可以處理多個異常,也可以指定可選的異常參數(將會是一個包含來自異常的代碼的診斷信息的類實例,異常參數自身會組成一個元組,并存儲為類實例的屬性),要避免裸except(會捕獲所有異常,沒有機會保存異常發生的原因,雖然可以通過sys.exc_info()獲得,但不推薦,如果想捕獲所有異常,可以在except中使用BaseException類,而Exception類不包括KeyboardInterrupt和SystemExit),finally無論發生錯誤與否都會執行。try-except-finally是個復合語句。try檢測到異常時,try語句塊中的剩余代碼是不會執行的,異常會延著堆棧向上提交,直到找到合適的異常處理器,如果到達最頂層仍然沒有找到對應的處理器,python解釋器會顯示出跟蹤返回消息,然后退出。
try-except語法如下:

try:   try_suite except Exception1[, reason1]:   suite_for_exception_ Exception1 except Exception2[, reason2]:   suite_for_exception_ Exception2 except (Exception3, Exception4)[, reason3_4]:   suite_for_exceptions_ Exception3_and_Exception4 except (Exc5[, Exc6[, ... ExcN]])[, reason]:   suite_for_exceptions_ Exc5_to_ExcN else:   suite_for_no_exception finally:   suite_always_run 

可同時捕捉多個異常,可捕捉異常對象,可忽略異常類型以捕捉所有異常

>>> try:   x = int(input('input x:'))   y = int(input('input y:'))   print('x/y = ',x/y) except ZeroDivisionError: #捕捉除0異常   print("ZeroDivision") except (TypeError,ValueError) as e: #捕捉多個異常,并將異常對象輸出   print(e) except: #捕捉其余類型異常   print("it's still wrong")     input x:12 input y:0 ZeroDivision >>> try:   x = int(input('input x:'))   y = int(input('input y:'))   print('x/y = ',x/y) except ZeroDivisionError: #捕捉除0異常   print("ZeroDivision") except (TypeError,ValueError) as e: #捕捉多個異常,并將異常對象輸出   print(e) except: #捕捉其余類型異常   print("it's still wrong")     input x:12 input y:y invalid literal for int() with base 10: 'y' 

try/except 可以加上 else 語句,實現在沒有異常時執行什么

>>> try:   x = int(input('input x:'))   y = int(input('input y:'))   print('x/y = ',x/y) except ZeroDivisionError: #捕捉除0異常   print("ZeroDivision") except (TypeError,ValueError) as e: #捕捉多個異常   print(e) except: #捕捉其余類型異常   print("it's still wrong") else: #沒有異常時執行   print('it work well')     input x:12 input y:3 x/y = 4.0 it work well 

3、上下文管理中的with語句
如上提到的try-except和try-finally,python對隱藏細節做了大量的工作,因此需要你操心的僅是如何解決你所遇到的問題。另一個隱藏低層次的抽象的例子是with語句,它在python2.6中正式啟用。python2.5嘗試性的引入了with,并對使用with作為標識符的應用程序發出這樣的警告――在python2.6中,with將會成為關鍵字。如果你想在python2.5使用wiht語句,你必須用from __fututure__ import with_statement來導入它。
類似try-except-finally,with語句也是用來簡化代碼的,這與用try-except和try-finally所想達到的目的千呼后應。try-except和try-finally的一種特定的配合用法是保證共享的資源的唯一分配,并在任務結束的時候釋放它。比如文件(數據、日志、數據庫等等),線程資源,簡單同步,數據庫連接等等,with語句的目的就是應用在這種場景。然而,with語句的目的在于從流程圖中把try,except和finally關鍵字和資源分配釋放相關代碼統統去掉,而不是像try-except-finally那樣僅僅簡化代碼使之易用。with語法的基本用法如下:

with context_expr [as var]:   with_suite 

看起來如此簡單,但with僅能工作于支持上下文管理協議的對象。當with語句執行時,便執行context_expr來獲得一個上下文管理器,其職責是提供一個上下文對象,這是通過調用__context__()方法來實現的。一旦我們獲得了上下文對象,就會調用它的__enter__()方法。當with語句塊執行結束,會調用上下文對象的__exit__()方法,有三個參數,如果with語句塊正常結束,三個參數都是None,如果發生異常,三個參數的值分別等于調用sys.exc_info()函數返回的三個值:類型(異常類),值(異常實例)和回溯(traceback)相應的回溯對象。contextlib模塊可以幫助編寫對象的上下文管理器。

常見異常:
Exception                        所有異常的基類
AttributeError                 特性應用或賦值失敗時引發
IOError                             試圖打開不存在的文件時引發
IndexError                       在使用序列中不存在的索引時引發
KeyError                          在使用映射不存在的鍵時引發
NameError                       在找不到名字(變量)時引發
SyntaxError                     在代碼為錯誤形式時引發
TypeError                         在內建操作或者函數應用于錯誤類型的對象是引發
ValueError                       在內建操作或者函數應用于正確類型的對象,但是該對象使用不合適的值時引發
ZeroDivisionError          在除法或者摸除操作的第二個參數為0時引發

4.自定義異常:
繼承于 Exception 的類

class myException(Exception):pass 
5.拋出異常:
raise 語句
>>> def division(x,y):   if y == 0 :     raise ZeroDivisionError('The zero is not allow')   return x/y  >>> try:   division(1,0) except ZeroDivisionError as e:   print(e)     The zero is not allow 
6.finally 語句
不管是否出現異常,最后都會執行finally的語句塊內容,用于清理工作
所以,你可以在 finally 語句中關閉文件,這樣就確保了文件能正常關閉
>>> try:   x = int(input('input x:'))   y = int(input('input y:'))   print('x/y = ',x/y) except ZeroDivisionError: #捕捉除0異常   print("ZeroDivision") except (TypeError,ValueError) as e: #捕捉多個異常   print(e) except: #捕捉其余類型異常   print("it's still wrong") else: #沒有異常時執行   print('it work well') finally: #不管是否有異常都會執行   print("Cleaning up")     input x:12 input y:3 x/y = 4.0 it work well Cleaning up 

異常拋出之后,如果沒有被接收,那么程序會拋給它的上一層,比如函數調用的地方,要是還是沒有接收,那繼續拋出,如果程序最后都沒有處理這個異常,那它就丟給操作系統了 -- 你的程序崩潰了,這點和C++一樣的。

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 定安县| 双柏县| 田林县| 昭觉县| 龙陵县| 勃利县| 孟连| 延安市| 南充市| 靖西县| 扎兰屯市| 沭阳县| 聂拉木县| 永吉县| 利辛县| 高陵县| 平塘县| 波密县| 华亭县| 鹤庆县| 平阴县| 雅安市| 五峰| 巴南区| 灵宝市| 石阡县| 元氏县| 石河子市| 教育| 思南县| 太仓市| 佛冈县| 张家界市| 乐至县| 井研县| 渑池县| 方山县| 秭归县| 城市| 青田县| 府谷县|