Python学习 Part6:错误和异常
兩種不同類(lèi)型的錯(cuò)誤:語(yǔ)法錯(cuò)誤和異常
1. 語(yǔ)法錯(cuò)誤
語(yǔ)法錯(cuò)誤,也被稱(chēng)作解析錯(cuò)誤:
>>> while True print('Hello world') SyntaxError: invalid syntax2. 異常
運(yùn)行期間檢測(cè)到的錯(cuò)誤稱(chēng)為異常,并且程序不會(huì)無(wú)條件的崩潰。
異常是以不同的類(lèi)型出現(xiàn)的,并且類(lèi)型也被當(dāng)作信息的一部分打印出來(lái):示例中包含ZeroDivisionError, NameError, TypeError類(lèi)型。
- 異常處理:
如果異常的類(lèi)型與except后面的異常類(lèi)型相匹配,那么except子句就會(huì)被執(zhí)行。一個(gè)try語(yǔ)句可以有多個(gè)except子句,用來(lái)明確的處理不同的異常。一個(gè)except子句可以通過(guò)帶括號(hào)的元組定義多個(gè)異常類(lèi)型:
except(RuntimeError,TypeError,NameError):passtry...:keyword:except語(yǔ)句有一個(gè)可選的else子句,如果存在,它必須在所有的except子句后面。如果try子句沒(méi)有拋出異常,這對(duì)那些必須執(zhí)行的代碼就非常有用。
for arg in sys.argv[1:]:try:f=open(arg,'r')except IOError:print('Cannot open', arg)else:print(arg,'has',len(f.readlines()),'lines')f.close()except子句可以在異常名稱(chēng)后面指定一個(gè)變量。
>>> try:raise Exception('spam','eggs') except Exception as inst:print(type(inst))print(inst.args)print(inst)<class 'Exception'> ('spam', 'eggs') ('spam', 'eggs')?
- 拋出異常:
raise語(yǔ)句允許程序員強(qiáng)制拋出一個(gè)指定的異常:
>>> raise NameError('Hi There') Traceback (most recent call last):File "<pyshell#39>", line 1, in <module>raise NameError('Hi There') NameError: Hi There如果需要確定是否拋出了一個(gè)異常而并不想去處理它,一個(gè)簡(jiǎn)單的raise語(yǔ)句允許你重新拋出異常:
>>> try:raise NameError('Hi There') except NameError:print('An exception flew by!')raiseAn exception flew by! Traceback (most recent call last):File "<pyshell#45>", line 2, in <module>raise NameError('Hi There') NameError: Hi There?
- 用戶(hù)自定義異常:
通過(guò)創(chuàng)建一個(gè)新的異常類(lèi),程序可以命名它們自己的異常。異常應(yīng)該是典型的繼承自Exception類(lèi),通過(guò)直接或間接的方式。
>>> class MyError(Exception):def __init__(self,value):self.value=valuedef __str__(self):return repr(self.value)>>> >>> try:raise MyError(2*2) except MyError as e:print('My exception occurred, value:',e.value)My exception occurred, value: 4 >>> raise MyError('opps!') Traceback (most recent call last):File "<pyshell#58>", line 1, in <module>raise MyError('opps!') MyError: 'opps!' >>>?
- 定義清理動(dòng)作
try語(yǔ)句有另外一個(gè)可選的子句,可以用來(lái)定義那些在所有情況下必須執(zhí)行的清理動(dòng)作:
>>> try:raise KeyboardInterrupt finally:print('Goodby, world!')Goodby, world! Traceback (most recent call last):File "<pyshell#63>", line 2, in <module>raise KeyboardInterrupt KeyboardInterrupt無(wú)論是否發(fā)生異常,一個(gè)finally子句在離開(kāi)try語(yǔ)句前總是會(huì)被執(zhí)行。當(dāng)在try子句中發(fā)生一個(gè)異常并且沒(méi)有被except子句處理時(shí),它將會(huì)在finally子句執(zhí)行完后被重新拋出。即使通過(guò)break,continue或者return等其他任何子句,當(dāng)要離開(kāi)try語(yǔ)句時(shí),finally子句也會(huì)被執(zhí)行。
>>> def divide(x,y):try:result=x/yexcept ZeroDivisionError:print('Division by zero!')else:print("Result is", result)finally:print("Executting finally clause")>>> divide(2,1) Result is 2.0 Executting finally clause >>> divide(2,0) Division by zero! Executting finally clause >>> divide("2","1") Executting finally clause Traceback (most recent call last):File "<pyshell#78>", line 1, in <module>divide("2","1")File "<pyshell#75>", line 3, in divideresult=x/y TypeError: unsupported operand type(s) for /: 'str' and 'str' >>>?
- 預(yù)定義的清理動(dòng)作
上段代碼的問(wèn)題是當(dāng)代碼執(zhí)行完畢后不知會(huì)過(guò)多久它才會(huì)關(guān)閉文件。with語(yǔ)句保證像文件這樣的對(duì)象在使用完之后總是可以被立即正確的清理:
>>> with open("testing.txt") as f:for line in f:print(line)?
?
轉(zhuǎn)載于:https://www.cnblogs.com/LilianChen/p/3384514.html
總結(jié)
以上是生活随笔為你收集整理的Python学习 Part6:错误和异常的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: windows编程(八)
- 下一篇: Delphi程序的主题(Theme)设置