日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python学习 Part6:错误和异常

發(fā)布時(shí)間:2024/4/17 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python学习 Part6:错误和异常 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

兩種不同類(lèi)型的錯(cuò)誤:語(yǔ)法錯(cuò)誤和異常

1. 語(yǔ)法錯(cuò)誤

語(yǔ)法錯(cuò)誤,也被稱(chēng)作解析錯(cuò)誤:

>>> while True print('Hello world') SyntaxError: invalid syntax

2. 異常
運(yùn)行期間檢測(cè)到的錯(cuò)誤稱(chēng)為異常,并且程序不會(huì)無(wú)條件的崩潰。

>>> 10*(1/0) Traceback (most recent call last):File "<pyshell#43>", line 1, in <module>10*(1/0) ZeroDivisionError: division by zero >>> 4+spam*3 Traceback (most recent call last):File "<pyshell#44>", line 1, in <module>4+spam*3 NameError: name 'spam' is not defined >>> '2'+2 Traceback (most recent call last):File "<pyshell#45>", line 1, in <module>'2'+2 TypeError: Can't convert 'int' object to str implicitly >>>

異常是以不同的類(lèi)型出現(xiàn)的,并且類(lèi)型也被當(dāng)作信息的一部分打印出來(lái):示例中包含ZeroDivisionError, NameError, TypeError類(lèi)型。

  • 異常處理:
>>> while True:try:x=int(input("Please enter a number: "))breakexcept ValueError:print("Oops! That was not valid number. Try again...")Please enter a number: a Oops! That was not valid number. Try again... Please enter a number: ggdg Oops! That was not valid number. Try again... Please enter a number: 34 >>> x 34

如果異常的類(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):pass

try...: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)作
>>> for line in open("testing.txt"):print(line)

上段代碼的問(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。