Python学习 Part6:错误和异常
兩種不同類型的錯誤:語法錯誤和異常
1. 語法錯誤
語法錯誤,也被稱作解析錯誤:
>>> while True print('Hello world') SyntaxError: invalid syntax2. 異常
運行期間檢測到的錯誤稱為異常,并且程序不會無條件的崩潰。
異常是以不同的類型出現的,并且類型也被當作信息的一部分打印出來:示例中包含ZeroDivisionError, NameError, TypeError類型。
- 異常處理:
如果異常的類型與except后面的異常類型相匹配,那么except子句就會被執行。一個try語句可以有多個except子句,用來明確的處理不同的異常。一個except子句可以通過帶括號的元組定義多個異常類型:
except(RuntimeError,TypeError,NameError):passtry...:keyword:except語句有一個可選的else子句,如果存在,它必須在所有的except子句后面。如果try子句沒有拋出異常,這對那些必須執行的代碼就非常有用。
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子句可以在異常名稱后面指定一個變量。
>>> try:raise Exception('spam','eggs') except Exception as inst:print(type(inst))print(inst.args)print(inst)<class 'Exception'> ('spam', 'eggs') ('spam', 'eggs')?
- 拋出異常:
raise語句允許程序員強制拋出一個指定的異常:
>>> raise NameError('Hi There') Traceback (most recent call last):File "<pyshell#39>", line 1, in <module>raise NameError('Hi There') NameError: Hi There如果需要確定是否拋出了一個異常而并不想去處理它,一個簡單的raise語句允許你重新拋出異常:
>>> 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?
- 用戶自定義異常:
通過創建一個新的異常類,程序可以命名它們自己的異常。異常應該是典型的繼承自Exception類,通過直接或間接的方式。
>>> 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!' >>>?
- 定義清理動作
try語句有另外一個可選的子句,可以用來定義那些在所有情況下必須執行的清理動作:
>>> try:raise KeyboardInterrupt finally:print('Goodby, world!')Goodby, world! Traceback (most recent call last):File "<pyshell#63>", line 2, in <module>raise KeyboardInterrupt KeyboardInterrupt無論是否發生異常,一個finally子句在離開try語句前總是會被執行。當在try子句中發生一個異常并且沒有被except子句處理時,它將會在finally子句執行完后被重新拋出。即使通過break,continue或者return等其他任何子句,當要離開try語句時,finally子句也會被執行。
>>> 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' >>>?
- 預定義的清理動作
上段代碼的問題是當代碼執行完畢后不知會過多久它才會關閉文件。with語句保證像文件這樣的對象在使用完之后總是可以被立即正確的清理:
>>> with open("testing.txt") as f:for line in f:print(line)?
?
轉載于:https://www.cnblogs.com/LilianChen/p/3384514.html
總結
以上是生活随笔為你收集整理的Python学习 Part6:错误和异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows编程(八)
- 下一篇: python多线程--theading模