Python 錯誤和異常小結[轉]

原文鏈接 ? ?http://blog.csdn.net/sinchb/article/details/8392827

? ? ?事先說明哦,這不是一篇關于Python異常的全面介紹的文章,這只是在學習Python異常后的一篇筆記式的記錄和小結性質的文章。什么?你還不知道什么是異常,額...

1.Python異常類

??? Python是面向對象語言,所以程序拋出的異常也是類。常見的Python異常有以下幾個,大家只要大致掃一眼,有個映像,等到編程的時候,相信大家肯定會不只一次跟他們照面(除非你不用Python了)。

???

異常描述
NameError嘗試訪問一個沒有申明的變量
ZeroDivisionError除數為0
SyntaxError語法錯誤
IndexError索引超出序列范圍
KeyError請求一個不存在的字典關鍵字
IOError輸入輸出錯誤(比如你要讀的文件不存在)
AttributeError嘗試訪問未知的對象屬性
ValueError傳給函數的參數類型不正確,比如給int()函數傳入字符串形

?

2.捕獲異常

??? Python完整的捕獲異常的語句有點像:

?

[html]?view plaincopy
  1. try:??
  2. ????try_suite??
  3. except?Exception1,Exception2,...,Argument:??
  4. ????exception_suite??
  5. ......???#other?exception?block??
  6. else:??
  7. ????no_exceptions_detected_suite??
  8. finally:??
  9. ????always_execute_suite??

??? 額...是不是很復雜?當然,當我們要捕獲異常的時候,并不是必須要按照上面那種格式完全寫下來,我們可以丟掉else語句,或者finally語句;甚至不要exception語句,而保留finally語句。額,暈了?好吧,下面,我們就來一一說明啦。

?

2.1.try...except...語句

??? try_suite不消我說大家也知道,是我們需要進行捕獲異常的代碼。而except語句是關鍵,我們try捕獲了代碼段try_suite里的異常后,將交給except來處理。

??? try...except語句最簡單的形式如下:

[python]?view plaincopy
  1. try:??
  2. ????try_suite??
  3. except:??
  4. ????exception?block??

??? 上面except子句不跟任何異常和異常參數,所以無論try捕獲了任何異常,都將交給except子句的exception block來處理。如果我們要處理特定的異常,比如說,我們只想處理除零異常,如果其他異常出現,就讓其拋出不做處理,該怎么辦呢?這個時候,我們就要給except子句傳入異常參數啦!那個ExceptionN就是我們要給except子句的異常類(請參考異常類那個表格),表示如果捕獲到這類異常,就交給這個except子句來處理。比如:

?

?

[python]?view plaincopy
  1. try:??
  2. ????try_suite??
  3. except?Exception:??
  4. ????exception?block??

??? 舉個例子:

?

?

[python]?view plaincopy
  1. >>>?try:??
  2. ...?????res?=?2/0??
  3. ...?except?ZeroDivisionError:??
  4. ...?????print?"Error:Divisor?must?not?be?zero!"??
  5. ...???
  6. Error:Divisor?must?not?be?zero!??

?

??? 看,我們真的捕獲到了ZeroDivisionError異常!那如果我想捕獲并處理多個異常怎么辦呢?有兩種辦法,一種是給一個except子句傳入多個異常類參數,另外一種是寫多個except子句,每個子句都傳入你想要處理的異常類參數。甚至,這兩種用法可以混搭呢!下面我就來舉個例子。

?

[python]?view plaincopy
  1. try:??
  2. ????floatnum?=?float(raw_input("Please?input?a?float:"))??
  3. ????intnum?=?int(floatnum)??
  4. ????print?100/intnum??
  5. except?ZeroDivisionError:??
  6. ????print?"Error:you?must?input?a?float?num?which?is?large?or?equal?then?1!"??
  7. except?ValueError:??
  8. ????print?"Error:you?must?input?a?float?num!"??
  9. ??
  10. [root@Cherish?tmp]#?python?test.py???
  11. Please?input?a?float:fjia??
  12. Error:you?must?input?a?float?num!??
  13. [root@Cherish?tmp]#?python?test.py???
  14. Please?input?a?float:0.9999??
  15. Error:you?must?input?a?float?num?which?is?large?or?equal?then?1!??
  16. [root@Cherish?tmp]#?python?test.py???
  17. Please?input?a?float:25.091??
  18. 4??

??? 上面的例子大家一看都懂,就不再解釋了。只要大家明白,我們的except可以處理一種異常,多種異常,甚至所有異常就可以了。

?

??? 大家可能注意到了,我們還沒解釋except子句后面那個Argument是什么東西?別著急,聽我一一道來。這個Argument其實是一個異常類的實例(別告訴我你不知到什么是實例),包含了來自異常代碼的診斷信息。也就是說,如果你捕獲了一個異常,你就可以通過這個異常類的實例來獲取更多的關于這個異常的信息。例如:

?

[python]?view plaincopy
  1. >>>?try:??
  2. ...?????1/0??
  3. ...?except?ZeroDivisionError,reason:??
  4. ...?????pass??
  5. ...???
  6. >>>?type(reason)??
  7. <type?'exceptions.ZeroDivisionError'>??
  8. >>>?print?reason??
  9. integer?division?or?modulo?by?zero??
  10. >>>?reason??
  11. ZeroDivisionError('integer?division?or?modulo?by?zero',)??
  12. >>>?reason.__class__??
  13. <type?'exceptions.ZeroDivisionError'>??
  14. >>>?reason.__class__.__doc__??
  15. 'Second?argument?to?a?division?or?modulo?operation?was?zero.'??
  16. >>>?reason.__class__.__name__??
  17. 'ZeroDivisionError'??

??? 上面這個例子,我們捕獲了除零異常,但是什么都沒做。那個reason就是異常類ZeroDivisionError的實例,通過type就可以看出。

?

2.2try ... except...else語句

??? 現在我們來說說這個else語句。Python中有很多特殊的else用法,比如用于條件和循環。放到try語句中,其作用其實也差不多:就是當沒有檢測到異常的時候,則執行else語句。舉個例子大家可能更明白些:

?

[python]?view plaincopy
  1. >>>?import?syslog??
  2. >>>?try:??
  3. ...?????f?=?open("/root/test.py")??
  4. ...?except?IOError,e:??
  5. ...?????syslog.syslog(syslog.LOG_ERR,"%s"%e)??
  6. ...?else:??
  7. ...?????syslog.syslog(syslog.LOG_INFO,"no?exception?caught\n")??
  8. ...???
  9. >>>?f.close()??

?

2.3 finally子句

??? finally子句是無論是否檢測到異常,都會執行的一段代碼。我們可以丟掉except子句和else子句,單獨使用try...finally,也可以配合except等使用。

例如2.2的例子,如果出現其他異常,無法捕獲,程序異常退出,那么文件 f 就沒有被正常關閉。這不是我們所希望看到的結果,但是如果我們把f.close語句放到finally語句中,無論是否有異常,都會正常關閉這個文件,豈不是很 妙

?

[python]?view plaincopy
  1. >>>?import?syslog??
  2. >>>?try:??
  3. ...?????f?=?open("/root/test.py")??
  4. ...?except?IOError,e:??
  5. ...?????syslog.syslog(syslog.LOG_ERR,"%s"%e)??
  6. ...?else:??
  7. ...?????syslog.syslog(syslog.LOG_INFO,"no?exception?caught\n")??
  8. ...?finally:???
  9. >>>?????f.close()??

??? 大家看到了沒,我們上面那個例子竟然用到了try,except,else,finally這四個子句!:-),是不是很有趣?到現在,你就基本上已經學會了如何在Python中捕獲常規異常并處理之。

?

3.兩個特殊的處理異常的簡便方法

3.1斷言(assert)

??? 什么是斷言,先看語法:

?

[python]?view plaincopy
  1. assert?expression[,reason]??

?

??? 其中assert是斷言的關鍵字。執行該語句的時候,先判斷表達式expression,如果表達式為真,則什么都不做;如果表達式不為真,則拋出異常。reason跟我們之前談到的異常類的實例一樣。不懂?沒關系,舉例子!最實在!

?

[python]?view plaincopy
  1. >>>?assert?len('love')?==?len('like')??
  2. >>>?assert?1==1??
  3. >>>?assert?1==2,"1?is?not?equal?2!"??
  4. Traceback?(most?recent?call?last):??
  5. ??File?"<stdin>",?line?1,?in?<module>??
  6. AssertionError:?1?is?not?equal?2!??

我們可以看到,如果assert后面的表達式為真,則什么都不做,如果不為真,就會拋出AssertionErro異常,而且我們傳進去的字符串會作為異常類的實例的具體信息存在。其實,assert異常也可以被try塊捕獲:

?

?

[python]?view plaincopy
  1. >>>?try:??
  2. ...?????assert?1?==?2?,?"1?is?not?equal?2!"??
  3. ...?except?AssertionError,reason:??
  4. ...?????print?"%s:%s"%(reason.__class__.__name__,reason)??
  5. ...???
  6. AssertionError:1?is?not?equal?2!??
  7. >>>?type(reason)??
  8. <type?'exceptions.AssertionError'>??

?

3.2.上下文管理(with語句)

?? 如果你使用try,except,finally代碼僅僅是為了保證共享資源(如文件,數據)的唯一分配,并在任務結束后釋放它,那么你就有福了!這個with語句可以讓你從try,except,finally中解放出來!語法如下:

?

[python]?view plaincopy
  1. with?context_expr?[as?var]:??
  2. ????with_suite??

??? 是不是不明白?很正常,舉個例子來!

?

[python]?view plaincopy
  1. >>>?with?open('/root/test.py')?as?f:??
  2. ...?????for?line?in?f:??
  3. ...?????????print?line??

??? 上面這幾行代碼干了什么?

??? (1)打開文件/root/test.py

??? (2)將文件對象賦值給? f

??? (3)將文件所有行輸出

???? (4)無論代碼中是否出現異常,Python都會為我們關閉這個文件,我們不需要關心這些細節。

??? 這下,是不是明白了,使用with語句來使用這些共享資源,我們不用擔心會因為某種原因而沒有釋放他。但并不是所有的對象都可以使用with語句,只有支持上下文管理協議(context management protocol)的對象才可以,那哪些對象支持該協議呢?如下表:

file?

decimal.Context

thread.LockType

threading.Lock

threading.RLock

threading.Condition

threading.Semaphore

threading.BoundedSemaphore

??? 至于什么是上下文管理協議,如果你不只關心怎么用with,以及哪些對象可以使用with,那么我們就不比太關心這個問題:)

4.拋出異常(raise)

??? 如果我們想要在自己編寫的程序中主動拋出異常,該怎么辦呢?raise語句可以幫助我們達到目的。其基本語法如下:

?

[python]?view plaincopy
  1. raise?[SomeException?[,?args?[,traceback]]??

??? 第一個參數,SomeException必須是一個異常類,或異常類的實例

?

??? 第二個參數是傳遞給SomeException的參數,必須是一個元組。這個參數用來傳遞關于這個異常的有用信息。

??? 第三個參數traceback很少用,主要是用來提供一個跟中記錄對象(traceback)

??? 下面我們就來舉幾個例子。

?

[python]?view plaincopy
  1. >>>?raise?NameError??
  2. Traceback?(most?recent?call?last):??
  3. ??File?"<stdin>",?line?1,?in?<module>??
  4. NameError??
  5. >>>?raise?NameError()??#異常類的實例??
  6. Traceback?(most?recent?call?last):??
  7. ??File?"<stdin>",?line?1,?in?<module>??
  8. NameError??
  9. >>>?raise?NameError,("There?is?a?name?error","in?test.py")??
  10. Traceback?(most?recent?call?last):??
  11. ??File?"<stdin>",?line?1,?in?<module>??
  12. >>>?raise?NameError("There?is?a?name?error","in?test.py")??#注意跟上面一個例子的區別??
  13. Traceback?(most?recent?call?last):??
  14. ??File?"<stdin>",?line?1,?in?<module>??
  15. NameError:?('There?is?a?name?error',?'in?test.py')??
  16. >>>?raise?NameError,NameError("There?is?a?name?error","in?test.py")??#注意跟上面一個例子的區別??
  17. Traceback?(most?recent?call?last):??
  18. ??File?"<stdin>",?line?1,?in?<module>??
  19. NameError:?('There?is?a?name?error',?'in?test.py')??

??? 其實,我們最常用的還是,只傳入第一個參數用來指出異常類型,最多再傳入一個元組,用來給出說明信息。如上面第三個例子。

?

5.異常和sys模塊

??? 另一種獲取異常信息的途徑是通過sys模塊中的exc_info()函數。該函數回返回一個三元組:(異常類,異常類的實例,跟中記錄對象)

?

[python]?view plaincopy
    1. >>>?try:??
    2. ...?????1/0??
    3. ...?except:??
    4. ...?????import?sys??
    5. ...?????tuple?=?sys.exc_info()??
    6. ...???
    7. >>>?print?tuple??
    8. (<type?'exceptions.ZeroDivisionError'>,?ZeroDivisionError('integer?division?or?modulo?by?zero',),?<traceback?object?at?0x7f538a318b48>)??
    9. >>>?for?i?in?tuple:??
    10. ...?????print?i??
    11. ...???
    12. <type?'exceptions.ZeroDivisionError'>?#異常類??????
    13. integer?division?or?modulo?by?zero?#異常類的實例??
    14. <traceback?object?at?0x7f538a318b48>?#跟蹤記錄對象??
歡迎加群互相學習,共同進步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,轉載請注明出處!




















本文轉自張昺華-sky博客園博客,原文鏈接:http://www.cnblogs.com/sunshine-anycall/p/4824395.html,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454443.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454443.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454443.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Django REST framework 認證、權限和頻率組件

認證與權限頻率組件 身份驗證是將傳入請求與一組標識憑據&#xff08;例如請求來自的用戶或其簽名的令牌&#xff09;相關聯的機制。然后 權限 和 限制 組件決定是否拒絕這個請求。 簡單來說就是&#xff1a; 認證確定了你是誰權限確定你能不能訪問某個接口限制確定你訪問某…

高速率AVS整數變換的匯編實現與優化

1 引言 AVS標準Ⅲ采用的8x8整數變換在獲得較H&#xff0e;264更高的壓縮率和主觀圖像質量的同時&#xff0c;增加了算法的實現復雜性和時間開銷。本文重點研究AVS編解碼器的整數變換模塊&#xff0c;針對不同的算法實現模式&#xff0c;在原有Visual C6&#xff0e;0整數變換模…

計算機與廣播電視論文,淺談廣播電視中計算機技術的作用論文.pdf

1、計算機技術在廣播電視的媒體內容中有重要應用在以往的廣播電視中&#xff0c; 媒體內容主要分為音頻和視頻兩種信號&#xff0c; 在傳輸的過程中使用的是模擬信號&#xff0c; 但模擬信號受到的外界干擾因素較為明顯&#xff0c; 因此廣播電視傳播的媒體內容受到影響&#x…

opencv安裝教程python3.7_Mac下安裝使用Python-OpenCV,解決opencv3安裝完成無法使用的問題 - pytorch中文網...

OpenCV是一個跨平臺計算機視覺庫&#xff0c;可以運行在Linux、Windows、Android和Mac OS操作系統上。提供了Python、Ruby、MATLAB等語言的接口&#xff0c;實現了圖像處理和計算機視覺方面的很多通用算法。 Mac安裝OpenCV 在我們的深度學習的過程中&#xff0c;對于圖像&#…

NodeJS在CentOs7下安裝

node下載地址:https://nodejs.org/en/download/ 1.安裝gcc $ yum install gcc-c 2.解壓最新版本 $ mkdir /usr/local/node$ tar zxvf node-v6.11.4.tar.gz $ cd node-v6.11.4$ ./configure --prefix/usr/local/node# 在當前目錄下編譯安裝Node$ make$ make install 3.驗證安裝 …

Python功能之反射

有如下文件: index.py 1<span style"font-family:宋體, SimSun;">#!/usr/bin/env python<br data-filtered"filtered"># -*- coding:utf-8 -*-<br data-filtered"filtered">__author__ ryan<br data-filtered"filter…

Django REST framework 分頁

分頁模式 rest framework中提供了三種分頁模式&#xff1a; from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination 全局配置 REST_FRAMEWORK {DEFAULT_PAGINATION_CLASS: rest_framework.pagination.LimitOffsetPaginat…

解析H.264視頻編解碼DSP實現與優化

引言 基于互聯網的數字視頻產業前景看好&#xff0c;而3G的規模部署&#xff0c;也會推動移動視頻通信成為現實。但數字化后的視頻圖像具有數據海量性&#xff0c;給圖像的存儲和傳輸造成較大的困難。數字視頻產業&#xff0c;是指數字內容中以數字視頻形態為主的文化創意和傳播…

ap計算機科學a買什么書,準備AP*計算機科學A考試-第1部分

你將學到什么Identify the use and proper use of Variables, Conditionals, Objects and primitives, control structures, booleans, lists and arrays, and Exceptions.Implement problem descriptions in well designed code.Identify and begin to design algorithms to s…

python 打包exe_python如何封裝為exe

1、首先進入python安裝路徑D:\Python27\Scripts下&#xff0c;查看pip或easy_install是否安裝。2、確保安裝了pip或者easy_install&#xff0c;在cmd命令行下輸入“easy_install”&#xff0c;沒有提示“xxx不是內部或外部命令……”&#xff0c;就說明easy install工具安裝成功…

CentOS7安裝Hadoop2.7完整步驟

總體思路&#xff0c;準備主從服務器&#xff0c;配置主服務器可以無密碼SSH登錄從服務器&#xff0c;解壓安裝JDK&#xff0c;解壓安裝Hadoop&#xff0c;配置hdfs、mapreduce等主從關系。 1、環境&#xff0c;3臺CentOS7&#xff0c;64位&#xff0c;Hadoop2.7需要64位Linux&…

Django REST framework 解析器和渲染器

解析器的作用 解析器的作用就是服務端接收客戶端傳過來的數據&#xff0c;把數據解析成自己可以處理的數據。本質就是對請求體中的數據進行解析。 在了解解析器之前&#xff0c;我們要先知道Accept以及ContentType請求頭。 Accept是告訴對方我能解析什么樣的數據&#xff0c…

MyBatis的學習之路(二)

上篇文章介紹了MyBatis的配置文件&#xff0c;現在來介紹實體映射文件Mapper.xml。 說道實體映射文件&#xff0c;就不得不說一下實體與表之間的映射關系&#xff1a;單表映射和多表映射。 a. 單表映射 1 public class Admin{ 2 private String id; 3 private String n…

計算機一級實驗素材題目,計算機一級EXCEL操作題整理素材(12頁)-原創力文檔...

素材摘錄&#xff0c;文檔可編輯分享PAGE 頁碼頁碼/NUMPAGES 總頁數總頁數單元格合并首先選中你要合并的單元格&#xff0c;然后找到EXCEL上的開始分區里的這種圖標或者是含有“合并”兩字的位置如圖1-1&#xff0c;如果題目要求的是要你合并單元格并讓內容居中&#xff0c;你就…

python爬取toefl_spark學習進度6-Python爬取數據的四個簡單實例

今天本來想把昨天安裝的intellij配置好&#xff0c;但是一直顯示沒有網絡&#xff0c;網上查了相關資料也沒有查出來解決辦法。然后暫停了intellij的配置&#xff0c;開始做了幾個Python爬取簡單數據的實例&#xff0c;先做了幾個最簡單的&#xff0c;以后再加大難度&#xff0…

Django REST framework 版本

API 版本控制允許我們在不同的客戶端之間更改行為&#xff08;同一個接口的不同版本會返回不同的數據&#xff09;。 DRF提供了許多不同的版本控制方案。 可能會有一些客戶端因為某些原因不再維護了&#xff0c;但是我們后端的接口還要不斷的更新迭代&#xff0c;這個時候通過…

AngularJS中的過濾器(filter)

AngularJS中的過濾器是用于對數據的格式化&#xff0c;或者篩選的函數&#xff0c;可以直接通過以下語法使用&#xff1a; {{expression|filter}} {{expression|filter1|filter2}} {{expression|filter1:param1,param2,...|filter2} 過濾器的種類有number&#xff0c;currency&…

計算機考試上傳照片教程,電腦照片傳到iPhone手機的詳細步驟【圖文】

蘋果自帶的iOS系統是不可以隨便和電腦進行數據交換的&#xff0c;必須使用iTunes軟件。許多用戶為此問題困擾&#xff0c;我們有什么可以把電腦照片傳到iPhone手機&#xff1f;下面我們就一起來看看把電腦照片傳到iphone設備的詳細步驟。具體方法如下&#xff1a;1&#xff0c;…

javaweb 導出文件名亂碼的問題解決方案

fileName new String(fileName.getBytes("ISO8859-1"), "UTF-8"); 或者 String finalFileName null; if(StringUtils.contains(userAgent, "MSIE")){//IE瀏覽器 finalFileName URLEncoder.encode(fileName,"UTF8"); }else if(Str…

AVS 分像素運動估計優化算法

—249—AVS 分像素運動估計優化算法楊涵悅 1&#xff0c;張兆楊1&#xff0c;滕國偉2(1. 上海大學通信學院&#xff0c;上海 200072&#xff1b;2. 上海廣電(集團)有限公司中央研究院&#xff0c;上海 200233)摘要&#xff1a;針對AVS 分像素運動估計的問題&#xff0c;提出一種…