摘要:另一種常見錯誤是邏輯錯誤。當檢測到一個錯誤時,解釋器就無法繼續(xù)執(zhí)行下去,于是拋出提示信息,即為異常。
錯誤
>>> for i in range(10) File "", line 1 for i in range(10) ^ SyntaxError: invalid syntax
上面那句話因為缺少冒號:,導致解釋器無法解釋,于是報錯。這個報錯行為是由Python的語法分析器完成的,并且檢測到了錯誤所在文件和行號(File "
另一種常見錯誤是邏輯錯誤。邏輯錯誤可能是由于不完整或者不合法的輸入導致,也可能是無法生成、計算等,或者是其它邏輯問題。
當Python檢測到一個錯誤時,解釋器就無法繼續(xù)執(zhí)行下去,于是拋出提示信息,即為異常。
異常下表中列出常見的異常
異常 | 描述 |
---|---|
NameError | 嘗試訪問一個沒有申明的變量 |
ZeroDivisionError | 除數(shù)為0 |
SyntaxError | 語法錯誤 |
IndexError | 索引超出序列范圍 |
KeyError | 請求一個不存在的字典關鍵字 |
IOError | 輸入輸出錯誤(比如你要讀的文件不存在) |
AttributeError | 嘗試訪問未知的對象屬性 |
>>> bar Traceback (most recent call last): File "", line 1, in NameError: name "bar" is not defined
Python中變量雖然不需在使用變量之前先聲明類型,但也需要對變量進行賦值,然后才能使用。不被賦值的變量,不能再Python中存在,因為變量相當于一個標簽,要把它貼到對象上才有意義。
ZeroDivisionError>>> 1/0 Traceback (most recent call last): File "SyntaxError", line 1, in ZeroDivisionError: integer division or modulo by zero
>>> for i in range(10) File "", line 1 for i in range(10) ^ SyntaxError: invalid syntax
這種錯誤發(fā)生在Python代碼編譯的時候,當編譯到這一句時,解釋器不能講代碼轉(zhuǎn)化為Python字節(jié)碼,就報錯。
IndexError和KeyError>>> a = [1,2,3] >>> a[4] Traceback (most recent call last): File "IOError", line 1, in IndexError: list index out of range >>> d = {"python":"itdiffer.com"} >>> d["java"] Traceback (most recent call last): File " ", line 1, in KeyError: "java"
>>> f = open("foo") Traceback (most recent call last): File "AttributeError", line 1, in IOError: [Errno 2] No such file or directory: "foo"
>>> class A(object): pass #Python 3: class A: pass ... >>> a = A() >>> a.foo Traceback (most recent call last): File "處理異常", line 1, in AttributeError: "A" object has no attribute "foo"
#!/usr/bin/env python # coding=utf-8 while 1: print "this is a division program." c = raw_input("input "c" continue, otherwise logout:") if c == "c": a = raw_input("first number:") b = raw_input("second number:") try: print float(a)/float(b) print "*************************" except ZeroDivisionError: print "The second number can"t be zero!" print "*************************" else: breaktry...except
對于上述程序,只看try和except部分,如果沒有異常發(fā)生,except子句在try語句執(zhí)行之后被忽略;如果try子句中有異常可,該部分的其它語句被忽略,直接跳到except部分,執(zhí)行其后面指定的異常類型及其子句。
except后面也可以沒有任何異常類型,即無異常參數(shù)。如果這樣,不論try部分發(fā)生什么異常,都會執(zhí)行except。
在except子句中,可以根據(jù)異常或者別的需要,進行更多的操作。比如:
#!/usr/bin/env python # coding=utf-8 class Calculator(object): is_raise = True def calc(self, express): try: return eval(express) #運行表達式 except ZeroDivisionError: if self.is_raise: print "zero can not be division." #Python 3: "zero can not be division." else: raise #拋出異常信息處理多個異常
Python 2: #!/usr/bin/env python # coding=utf-8 while 1: print "this is a division program." c = raw_input("input "c" continue, otherwise logout:") if c == "c": a = raw_input("first number:") b = raw_input("second number:") try: print float(a)/float(b) print "*************************" except ZeroDivisionError: print "The second number can"t be zero!" print "*************************" except ValueError: print "please input number." print "************************" else: break or except (ZeroDivisionError, ValueError): #括號內(nèi)也可以包含多個異常 print "please input rightly." print "********************"打印異常,但程序不中斷
while 1: print "this is a division program." c = raw_input("input "c" continue, otherwise logout:") if c == "c": a = raw_input("first number:") b = raw_input("second number:") try: print float(a)/float(b) print "*************************" except (ZeroDivisionError, ValueError), e: #類似java print e print "********************" else: break Python 3: while 1: print("this is a division program.") c = input("input "c" continue, otherwise logout:") if c == "c": a = input("first number:") b = input("second number:") try: print(float(a)/float(b)) print("*************************") except (ZeroDivisionError, ValueError) as e: print(e) print("********************") else: breakelse語句
>>> try: ... print "I am try" #Python 3: print("I am try"), ... except: ... print "I am except" ... else: #處理except就不會運行else ... print "I am else" ... I am try I am else
else語句應用,只有輸入正確的內(nèi)容,循環(huán)才會終止
#!/usr/bin/env python # coding=utf-8 while 1: try: x = raw_input("the first number:") y = raw_input("the second number:") r = float(x)/float(y) print r except Exception, e: #python3為 Exception as e: print e print "try again." else: breakfinally語句
如果有了finally,不管前面執(zhí)行的是try,還是except,最終都要執(zhí)行它。類似java
>>> x = 10 >>> try: ... x = 1/0 ... except Exception, e: #Python 3: except Exception as e: ... print e #Python 3: print(e) ... finally: ... print "del x" #Python 3: print(e) ... del x ... integer division or modulo by zero del xassert
assert是一句等價于布爾真的判定,發(fā)生異常就意味著表達式為假。當程序運行到某個節(jié)點的時候,就斷定某個變量的值必然是什么,或者對象必然擁有某個屬性等,簡單說就是斷定什么東西必然是什么,如果不是,就拋出異常。
#!/usr/bin/env python # coding=utf-8 if __name__ == "__main__": a = 8 assert a < 0 print a Traceback (most recent call last): File "/Users/liuguoquan/Documents/workspace/PythonDemo/main.py", line 6, inassert a < 0 AssertionError
這就是斷言assert的引用。什么是使用斷言的最佳時機?有文章做了總結(jié):
如果沒有特別的目的,斷言應該用于如下情況:
防御性的編程
運行時對程序邏輯的檢測
合約性檢查(比如前置條件,后置條件)
程序中的常量
檢查文檔
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/38202.html
摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術服務,現(xiàn)整理出零基礎如何學爬蟲技術以供學習,。本文來源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲軟件定制開發(fā)服務,服務范圍涵蓋社交網(wǎng)絡電子商務分類信息學術研究等。 楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術服務,現(xiàn)整理出零基礎如何學爬蟲技術以供學習,http://www.chujiangdata.com。 第一:Python爬蟲學習系列教程(來源于某博主:htt...
摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優(yōu)秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數(shù)據(jù)結(jié)構(gòu)、語法...
摘要:貢獻者飛龍版本最近總是有人問我,把這些資料看完一遍要用多長時間,如果你一本書一本書看的話,的確要用很長時間。為了方便大家,我就把每本書的章節(jié)拆開,再按照知識點合并,手動整理了這個知識樹。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 貢獻者:飛龍版...
文章目錄 強烈推薦系列教程,建議學起來!! 一.pycharm下載安裝二.python下載安裝三.pycharm上配置python四.配置鏡像源讓你下載嗖嗖的快4.1pycharm內(nèi)部配置 4.2手動添加鏡像源4.3永久配置鏡像源 五.插件安裝(比如漢化?)5.1自動補碼神器第一款5.2漢化pycharm5.3其它插件 六.美女背景七.自定義腳本開頭八、這個前言一定要看九、pyt...
摘要:大家好,在我們上一篇復習了的基礎和實用技巧后,今天我們來看一下里的邏輯關系,所謂邏輯關系無非就是如果就否則之類的,不是非常復雜,我的意思是復雜的地方不用目前了解,因為已經(jīng)超出了小白的水準,哈哈,閑話少說,讓我們一起來看看吧什么是里面用的形 大家好,在我們上一篇復習了dict的基礎和實用技巧后,今天我們來看一下Python里的邏輯關系,所謂邏輯關系無非就是如果...就...否則...之類...
閱讀 687·2021-11-18 10:07
閱讀 2878·2021-09-22 16:04
閱讀 873·2021-08-16 10:50
閱讀 3326·2019-08-30 15:56
閱讀 1784·2019-08-29 13:22
閱讀 2646·2019-08-26 17:15
閱讀 1228·2019-08-26 10:57
閱讀 1103·2019-08-23 15:23