久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

博客專欄

EEPW首頁(yè) > 博客 > Python3語(yǔ)法錯(cuò)誤和異常處理詳解分享

Python3語(yǔ)法錯(cuò)誤和異常處理詳解分享

發(fā)布人:only1 時(shí)間:2020-10-13 來(lái)源:工程師 發(fā)布文章

  今天扣丁學(xué)堂給大家總結(jié)了一下關(guān)于Python3錯(cuò)誤和異常的介紹,首先作為Python初學(xué)者,在剛學(xué)習(xí)Pythonj核心編程時(shí),經(jīng)常會(huì)看到一些報(bào)錯(cuò)信息,下面我們一起來(lái)看一下都有哪些語(yǔ)法錯(cuò)誤及異常。

  Python有兩種錯(cuò)誤很容易辨認(rèn):語(yǔ)法錯(cuò)誤和異常。


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


  Python的語(yǔ)法錯(cuò)誤或者稱之為解析錯(cuò),是初學(xué)者經(jīng)常碰到的,如下實(shí)例


  >>>whileTrueprint('Helloworld')


  File"",line1,in?


  whileTrueprint('Helloworld')


  ^


  SyntaxError:invalidsyntax


  這個(gè)例子中,函數(shù)print()被檢查到有錯(cuò)誤,是它前面缺少了一個(gè)冒號(hào)(:)。


  語(yǔ)法分析器指出了出錯(cuò)的一行,并且在最先找到的錯(cuò)誤的位置標(biāo)記了一個(gè)小小的箭頭。


  異常


  即便Python程序的語(yǔ)法是正確的,在運(yùn)行它的時(shí)候,也有可能發(fā)生錯(cuò)誤。運(yùn)行期檢測(cè)到的錯(cuò)誤被稱為異常。


  大多數(shù)的異常都不會(huì)被程序處理,都以錯(cuò)誤信息的形式展現(xiàn)在這里:


  >>>10*(1/0)


  Traceback(mostrecentcalllast):


  File"",line1,in?


  ZeroDivisionError:divisionbyzero


  >>>4+spam*3


  Traceback(mostrecentcalllast):


  File"",line1,in?


  NameError:name'spam'isnotdefined


  >>>'2'+2


  Traceback(mostrecentcalllast):


  File"",line1,in?


  TypeError:Can'tconvert'int'objecttostrimplicitly


  異常以不同的類型出現(xiàn),這些類型都作為信息的一部分打印出來(lái):例子中的類型有ZeroDivisionError,NameError和TypeError。


  錯(cuò)誤信息的前面部分顯示了異常發(fā)生的上下文,并以調(diào)用棧的形式顯示具體信息。


  異常處理


  以下例子中,讓用戶輸入一個(gè)合法的整數(shù),但是允許用戶中斷這個(gè)程序(使用Control-C或者操作系統(tǒng)提供的方法)。用戶中斷的信息會(huì)引發(fā)一個(gè)KeyboardInterrupt異常。


  >>>whileTrue:


  try:


  x=int(input("Pleaseenteranumber:"))


  break


  exceptValueError:


  print("Oops!Thatwasnovalidnumber.Tryagain")


  try語(yǔ)句按照如下方式工作;


  首先,執(zhí)行try子句(在關(guān)鍵字try和關(guān)鍵字except之間的語(yǔ)句)


  如果沒(méi)有異常發(fā)生,忽略except子句,try子句執(zhí)行后結(jié)束。


  如果在執(zhí)行try子句的過(guò)程中發(fā)生了異常,那么try子句余下的部分將被忽略。如果異常的類型和except之后的名稱相符,那么對(duì)應(yīng)的except子句將被執(zhí)行。最后執(zhí)行try語(yǔ)句之后的代碼。


  如果一個(gè)異常沒(méi)有與任何的except匹配,那么這個(gè)異常將會(huì)傳遞給上層的try中。


  一個(gè)try語(yǔ)句可能包含多個(gè)except子句,分別來(lái)處理不同的特定的異常。最多只有一個(gè)分支會(huì)被執(zhí)行。


  處理程序?qū)⒅会槍?duì)對(duì)應(yīng)的try子句中的異常進(jìn)行處理,而不是其他的try的處理程序中的異常。


  一個(gè)except子句可以同時(shí)處理多個(gè)異常,這些異常將被放在一個(gè)括號(hào)里成為一個(gè)元組,例如:


  except(RuntimeError,TypeError,NameError):


  pass


  最后一個(gè)except子句可以忽略異常的名稱,它將被當(dāng)作通配符使用。你可以使用這種方法打印一個(gè)錯(cuò)誤信息,然后再次把異常拋出。


  importsys


  try:


  f=open('myfile.txt')


  s=f.readline()


  i=int(s.strip())


  exceptOSErroraserr:


  print("OSerror:{0}".format(err))


  exceptValueError:


  print("Couldnotconvertdatatoaninteger.")


  except:


  print("Unexpectederror:",sys.exc_info()[0])


  raise


  tryexcept語(yǔ)句還有一個(gè)可選的else子句,如果使用這個(gè)子句,那么必須放在所有的except子句之后。這個(gè)子句將在try子句沒(méi)有發(fā)生任何異常的時(shí)候執(zhí)行。例如:


  forarginsys.argv[1:]:


  try:


  f=open(arg,'r')


  exceptIOError:


  print('cannotopen',arg)


  else:


  print(arg,'has',len(f.readlines()),'lines')


  f.close()


  使用else子句比把所有的語(yǔ)句都放在try子句里面要好,這樣可以避免一些意想不到的、而except又沒(méi)有捕獲的異常。


  異常處理并不僅僅處理那些直接發(fā)生在try子句中的異常,而且還能處理子句中調(diào)用的函數(shù)(甚至間接調(diào)用的函數(shù))里拋出的異常。例如:


  >>>defthis_fails():


  x=1/0


  >>>try:


  this_fails()


  exceptZeroDivisionErroraserr:


  print('Handlingrun-timeerror:',err)


  Handlingrun-timeerror:intdivisionormodulobyzero


  拋出異常


  Python使用raise語(yǔ)句拋出一個(gè)指定的異常。例如:


  >>>raiseNameError('HiThere')


  Traceback(mostrecentcalllast):


  File"",line1,in?


  NameError:HiThere


  raise唯一的一個(gè)參數(shù)指定了要被拋出的異常。它必須是一個(gè)異常的實(shí)例或者是異常的類(也就是Exception的子類)。


  如果你只想知道這是否拋出了一個(gè)異常,并不想去處理它,那么一個(gè)簡(jiǎn)單的raise語(yǔ)句就可以再次把它拋出。


  >>>try:


  raiseNameError('HiThere')


  exceptNameError:


  print('Anexceptionflewby!')


  raise


  Anexceptionflewby!


  Traceback(mostrecentcalllast):


  File"",line2,in?


  NameError:HiThere


  用戶自定義異常


  你可以通過(guò)創(chuàng)建一個(gè)新的exception類來(lái)?yè)碛凶约旱漠惓!.惓?yīng)該繼承自Exception類,或者直接繼承,或者間接繼承,例如:


  >>>classMyError(Exception):


  def__init__(self,value):


  self.value=value


  def__str__(self):


  returnrepr(self.value)


  >>>try:


  raiseMyError(2*2)


  exceptMyErrorase:


  print('Myexceptionoccurred,value:',e.value)


  Myexceptionoccurred,value:4


  >>>raiseMyError('oops!')


  Traceback(mostrecentcalllast):


  File"",line1,in?


  __main__.MyError:'oops!'


  在這個(gè)例子中,類Exception默認(rèn)的__init__()被覆蓋。


  當(dāng)創(chuàng)建一個(gè)模塊有可能拋出多種不同的異常時(shí),一種通常的做法是為這個(gè)包建立一個(gè)基礎(chǔ)異常類,然后基于這個(gè)基礎(chǔ)類為不同的錯(cuò)誤情況創(chuàng)建不同的子類:


  classError(Exception):


  """Baseclassforexceptionsinthismodule."""


  pass


  classInputError(Error):


  """Exceptionraisedforerrorsintheinput.


  Attributes:


  expression--inputexpressioninwhichtheerroroccurred


  message--explanationoftheerror


  """


  def__init__(self,expression,message):


  self.expression=expression


  self.message=message


  classTransitionError(Error):


  """Raisedwhenanoperationattemptsastatetransitionthat'snot


  allowed.


  Attributes:


  previous--stateatbeginningoftransition


  next--attemptednewstate


  message--explanationofwhythespecifictransitionisnotallowed


  """


  def__init__(self,previous,next,message):


  self.previous=previous


  self.next=next


  self.message=message


  大多數(shù)的異常的名字都以"Error"結(jié)尾,就跟標(biāo)準(zhǔn)的異常命名一樣。


  定義清理行為


  try語(yǔ)句還有另外一個(gè)可選的子句,它定義了無(wú)論在任何情況下都會(huì)執(zhí)行的清理行為。例如:


  >>>try:


  ...raiseKeyboardInterrupt


  ...finally:


  ...print('Goodbye,world!')


  ...


  Goodbye,world!


  Traceback(mostrecentcalllast):


  File"",line2,in


  KeyboardInterrupt


  以上例子不管try子句里面有沒(méi)有發(fā)生異常,finally子句都會(huì)執(zhí)行。


  如果一個(gè)異常在try子句里(或者在except和else子句里)被拋出,而又沒(méi)有任何的except把它截住,那么這個(gè)異常會(huì)在finally子句執(zhí)行后再次被拋出。


  下面是一個(gè)更加復(fù)雜的例子(在同一個(gè)try語(yǔ)句里包含except和finally子句):


  >>>defdivide(x,y):


  try:


  result=x/y


  exceptZeroDivisionError:


  print("divisionbyzero!")


  else:


  print("resultis",result)


  finally:


  print("executingfinallyclause")


  >>>divide(2,1)


  resultis2.0


  executingfinallyclause


  >>>divide(2,0)


  divisionbyzero!


  executingfinallyclause


  >>>divide("2","1")


  executingfinallyclause


  Traceback(mostrecentcalllast):


  File"",line1,in?


  File"",line3,individe


  TypeError:unsupportedoperandtype(s)for/:'str'and'str'


  預(yù)定義的清理行為


  一些對(duì)象定義了標(biāo)準(zhǔn)的清理行為,無(wú)論系統(tǒng)是否成功的使用了它,一旦不需要它了,那么這個(gè)標(biāo)準(zhǔn)的清理行為就會(huì)執(zhí)行。


  這面這個(gè)例子展示了嘗試打開(kāi)一個(gè)文件,然后把內(nèi)容打印到屏幕上:


  forlineinopen("myfile.txt"):


  print(line,end="")


  以上這段代碼的問(wèn)題是,當(dāng)執(zhí)行完畢后,文件會(huì)保持打開(kāi)狀態(tài),并沒(méi)有被關(guān)閉。


  關(guān)鍵詞with語(yǔ)句就可以保證諸如文件之類的對(duì)象在使用完之后一定會(huì)正確的執(zhí)行他的清理方法:


  withopen("myfile.txt")asf:


  forlineinf:


  print(line,end="")


  以上這段代碼執(zhí)行完畢后,就算在處理過(guò)程中出問(wèn)題了,文件f總是會(huì)關(guān)閉。


  以上就是關(guān)于Python3語(yǔ)法錯(cuò)誤和異常處理的詳細(xì)介紹,最后想要了解更多關(guān)于Python發(fā)展前景趨勢(shì),請(qǐng)關(guān)注扣丁學(xué)堂官網(wǎng)、微信等平臺(tái),扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育平臺(tái)為您提供權(quán)威的Python培訓(xùn)視頻教程系統(tǒng),通過(guò)千鋒扣丁學(xué)堂金牌講師在線錄制的Python視頻教程課程,讓你快速掌握Python從入門(mén)到精通開(kāi)發(fā)實(shí)戰(zhàn)技能。扣丁學(xué)堂Python技術(shù)交流群:816572891。

*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。

晶體管相關(guān)文章:晶體管工作原理


電容傳感器相關(guān)文章:電容傳感器原理
晶體管相關(guān)文章:晶體管原理
電子負(fù)載相關(guān)文章:電子負(fù)載原理


關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉