最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python入門(mén)第8/10頁(yè)

 更新時(shí)間:2007年02月08日 00:00:00   作者:  

第八章 錯(cuò)誤與例外
到現(xiàn)在為止我們只是提到了錯(cuò)誤信息而沒(méi)有詳細(xì)討論,如果你運(yùn)行了前面的例子可能已經(jīng)看到了一些錯(cuò)誤信息。至少有兩種不同錯(cuò)誤:句法錯(cuò)和例外錯(cuò)(exceptions)。

8.1 句法錯(cuò)
 句法錯(cuò)也稱(chēng)為語(yǔ)法分析錯(cuò),是你在學(xué)習(xí)Python的時(shí)候最可能犯的錯(cuò)誤。 

>>> while 1 print 'Hello world'
  File "<stdin>", line 1
    while 1 print 'Hello world'
                ^
SyntaxError: invalid syntax


語(yǔ)法分析器重復(fù)出錯(cuò)行,并用一個(gè)小‘箭頭'指向行內(nèi)最早發(fā)現(xiàn)錯(cuò)誤的位置。錯(cuò)誤是由箭頭前面的記號(hào)引起的(至少是在這里檢測(cè)到的)。在本例中,錯(cuò)誤在關(guān)鍵字print處檢測(cè)到,因?yàn)樗懊鎽?yīng)該有一個(gè)冒號(hào)(“:”)。錯(cuò)誤信息中顯示了文件名和行號(hào)這樣如果錯(cuò)誤發(fā)生在一個(gè)腳本文件中你就知道到哪里去找。

8.2 例外
即使語(yǔ)句或表達(dá)式句法沒(méi)有問(wèn)題,在試圖運(yùn)行的時(shí)候也可能發(fā)生錯(cuò)誤。運(yùn)行時(shí)檢測(cè)到的錯(cuò)誤叫做例外,這種錯(cuò)誤不一定必然是致命的:你很快就會(huì)學(xué)到如何在Python程序中處理例外。然而,多數(shù)例外不能被程序處理,這是會(huì)產(chǎn)生錯(cuò)誤信息,如:

>>> 10 * (1/0)
Traceback (innermost last):
  File "<stdin>", line 1
ZeroDivisionError: integer division or modulo
>>> 4 + spam*3
Traceback (innermost last):
  File "<stdin>", line 1
NameError: spam
>>> '2' + 2
Traceback (innermost last):
  File "<stdin>", line 1
TypeError: illegal argument type for built-in operation


錯(cuò)誤信息的最后一行顯示發(fā)生的情況。例外有不同的類(lèi)型,類(lèi)型作為錯(cuò)誤信息的一部分顯示:上例中錯(cuò)誤的類(lèi)型有ZeroDivisionError、NameError和TypeError。作為例外類(lèi)型顯示的字符串是發(fā)生的例外的內(nèi)置名。這對(duì)于所有內(nèi)置例外成立,但對(duì)用戶自定義例外不一定成立(用戶最好能遵守這樣的約定)。標(biāo)準(zhǔn)例外名是內(nèi)置的標(biāo)識(shí)符(不是保留關(guān)鍵字)。

此行的其余部分是錯(cuò)誤的細(xì)節(jié),其解釋依賴于例外類(lèi)型。錯(cuò)誤信息前面的部分以堆棧反跟蹤的形式顯示了發(fā)生錯(cuò)誤的上下文環(huán)境。一般這包含了列出源代碼行的一個(gè)列出源程序行的堆棧反跟蹤;然而,它不會(huì)顯示從標(biāo)準(zhǔn)輸入讀進(jìn)的行。

 庫(kù)參考手冊(cè)列出了內(nèi)置例外和其含義?!?nbsp;

8.3 例外處理
 可以編程序來(lái)處理選定的例外。請(qǐng)看下面的例子,顯示一些浮點(diǎn)數(shù)的倒數(shù): 

>>> numbers = [0.3333, 2.5, 0, 10]
>>> for x in numbers:
...     print x,
...     try:
...         print 1.0 / x
...     except ZeroDivisionError:
...         print '*** has no inverse ***'
...     
0.3333 3.00030003
2.5 0.4
0 *** has no inverse ***
10 0.1


try語(yǔ)句是這樣工作的:

首先,運(yùn)行try子句(在try和except之間的語(yǔ)句)。 
如果沒(méi)有發(fā)生例外,跳過(guò)except子句,try語(yǔ)句運(yùn)行完畢。 
如果在try子句中發(fā)生了例外錯(cuò)誤而且例外錯(cuò)誤匹配except后指定的例外名,則跳過(guò)try 子句剩下的部分,執(zhí)行except子句,然后繼續(xù)執(zhí)行try語(yǔ)句后面的程序。 
如果在try子句中發(fā)生了例外錯(cuò)誤但是例外錯(cuò)誤不匹配except后指定的例外名,則此例外被傳給外層的try語(yǔ)句。如果沒(méi)有找到匹配的處理程序則此例外稱(chēng)作是未處理例外,程序停止運(yùn)行,顯示錯(cuò)誤信息。 
try語(yǔ)句可以有多個(gè)except子句,為不同的例外指定不同處理。至多只執(zhí)行一個(gè)錯(cuò)誤處理程序。錯(cuò)誤處理程序只處理相應(yīng)的try子句中發(fā)生的例外,如果同try語(yǔ)句中其它的錯(cuò)誤處理程序中發(fā)生例外錯(cuò)誤處理程序不會(huì)反應(yīng)。一個(gè)except子句可以列出多個(gè)例外,寫(xiě)在括號(hào)里用逗號(hào)分開(kāi),例如:

... except (RuntimeError, TypeError, NameError):
...     pass


最后一個(gè)except子句可以省略例外名,作為一個(gè)通配項(xiàng)。這種方法要謹(jǐn)慎使用,因?yàn)檫@可能會(huì)導(dǎo)致程序?qū)嶋H已出錯(cuò)卻發(fā)現(xiàn)不了。

try ... except語(yǔ)句有一個(gè)可選的else子句,如有的話要放在所有except子句之后。else 的意思是沒(méi)有發(fā)生例外,我們可以把try子句中沒(méi)有發(fā)生例外時(shí)要做的事情放在這個(gè)子句里。例如:

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print '不能打開(kāi)', arg
    else:
        print arg, '有', len(f.readlines()), '行'
        f.close()


例外發(fā)生時(shí)可能伴有一個(gè)值,叫做例外的參數(shù)。參數(shù)是否存在及其類(lèi)型依賴于例外的類(lèi)型。對(duì)于有參數(shù)的例外,except在自居可以在例外名(或表)后指定一個(gè)變量用來(lái)接受例外的參數(shù)值,如:

>>> try:
...     spam()
... except NameError, x:
...     print 'name', x, 'undefined'
... 
name spam undefined


有參數(shù)的例外未處理時(shí)會(huì)在錯(cuò)誤信息的最后細(xì)節(jié)部分列出其參數(shù)值?!?nbsp;

例外處理程序不僅處理直接產(chǎn)生于try子句中的例外,也可以處理try子句中調(diào)用的函數(shù)(甚至是間接調(diào)用的函數(shù))中的例外。如:

>>> def this_fails():
...     x = 1/0
... 
>>> try:
...     this_fails()
... except ZeroDivisionError, detail:
...     print 'Handling run-time error:', detail
... 
Handling run-time error: integer division or modulo


8.4 產(chǎn)生例外
raise語(yǔ)句允許程序員強(qiáng)行產(chǎn)生指定的例外。例如: 

>>> raise NameError, 'HiThere'
Traceback (innermost last):
  File "<stdin>", line 1
NameError: HiThere


raise語(yǔ)句的第一個(gè)參數(shù)指定要產(chǎn)生的例外的名字??蛇x的第二參數(shù)指定例外的參數(shù)。  

8.5 用戶自定義例外
程序中可以定義自己的例外,只要把一個(gè)字符串賦給一個(gè)變量即可。例如: 

>>> my_exc = 'my_exc'
>>> try:
...     raise my_exc, 2*2
... except my_exc, val:
...     print 'My exception occurred, value:', val
... 
My exception occurred, value: 4
>>> raise my_exc, 1
Traceback (innermost last):
  File "<stdin>", line 1
my_exc: 1


許多標(biāo)準(zhǔn)模塊用這種方法報(bào)告自己定義的函數(shù)中發(fā)生的錯(cuò)誤。  

8.6 定義清理動(dòng)作
  try語(yǔ)句還有另一個(gè)finally可選子句,可以用來(lái)規(guī)定不論出錯(cuò)與否都要執(zhí)行的動(dòng)作。例如: 

>>> try:
...     raise KeyboardInterrupt
... finally:
...     print 'Goodbye, world!'
... 
Goodbye, world!
Traceback (innermost last):
  File "<stdin>", line 2
KeyboardInterrupt


finally子句不論try子句中是否發(fā)生例外都會(huì)執(zhí)行。例外發(fā)生時(shí),先執(zhí)行finally子句然后重新提出該例外。當(dāng)try語(yǔ)句用break或return語(yǔ)句退出時(shí)也將執(zhí)行finally子句。

要注意的是,try語(yǔ)句有了except子句就不能有finally子句,有了finally子句就不能有except 子句,不能同時(shí)使用except子句和finally子句。需要的話可以嵌套。

相關(guān)文章

  • Python利用Rasa框架和SMTPlib庫(kù)實(shí)現(xiàn)郵件回復(fù)助手

    Python利用Rasa框架和SMTPlib庫(kù)實(shí)現(xiàn)郵件回復(fù)助手

    在現(xiàn)代辦公場(chǎng)景中,處理大量郵件是一項(xiàng)既耗時(shí)又容易出錯(cuò)的任務(wù),本文將詳細(xì)介紹如何使用Python的Rasa框架和SMTPlib庫(kù)建一個(gè)智能的郵件自動(dòng)回復(fù)助手,感興趣的可以了解下
    2025-04-04
  • 通過(guò)數(shù)據(jù)庫(kù)向Django模型添加字段的示例

    通過(guò)數(shù)據(jù)庫(kù)向Django模型添加字段的示例

    這篇文章主要介紹了通過(guò)數(shù)據(jù)庫(kù)向Django模型添加字段的示例,Django是人氣最高的Python web開(kāi)發(fā)框架,需要的朋友可以參考下
    2015-07-07
  • python多線程socket編程之多客戶端接入

    python多線程socket編程之多客戶端接入

    這篇文章主要為大家詳細(xì)介紹了python多線程socket編程之多客戶端接入,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • python selenium 執(zhí)行完畢關(guān)閉chromedriver進(jìn)程示例

    python selenium 執(zhí)行完畢關(guān)閉chromedriver進(jìn)程示例

    今天小編就為大家分享一篇python selenium 執(zhí)行完畢關(guān)閉chromedriver進(jìn)程示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • python安裝numpy&安裝matplotlib& scipy的教程

    python安裝numpy&安裝matplotlib& scipy的教程

    下面小編就為大家?guī)?lái)一篇python安裝numpy&安裝matplotlib& scipy的教程。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • python實(shí)現(xiàn)DEM數(shù)據(jù)的陰影生成的方法

    python實(shí)現(xiàn)DEM數(shù)據(jù)的陰影生成的方法

    這篇文章主要介紹了python實(shí)現(xiàn)DEM數(shù)據(jù)的陰影生成的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • linux環(huán)境下Django的安裝配置詳解

    linux環(huán)境下Django的安裝配置詳解

    這篇文章主要介紹了linux環(huán)境下Django的安裝配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Jupyter notebook 更改文件打開(kāi)的默認(rèn)路徑操作

    Jupyter notebook 更改文件打開(kāi)的默認(rèn)路徑操作

    這篇文章主要介紹了Jupyter notebook 更改文件打開(kāi)的默認(rèn)路徑操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • Python之Matplotlib繪圖調(diào)節(jié)清晰度解決方案

    Python之Matplotlib繪圖調(diào)節(jié)清晰度解決方案

    Matplotlib是一個(gè)Python的繪圖庫(kù),可以用來(lái)繪制各種類(lèi)型的圖表,包括線圖、散點(diǎn)圖、柱狀圖等等,這篇文章主要給大家介紹了關(guān)于Python之Matplotlib繪圖調(diào)節(jié)清晰度的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • Python yield 使用方法淺析

    Python yield 使用方法淺析

    本篇文章主要介紹了Python yield 使用方法淺析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05

最新評(píng)論

鹤庆县| 屯门区| 武安市| 长岛县| 永春县| 扬中市| 黔西| 车致| 克拉玛依市| 鱼台县| 林口县| 自治县| 文水县| 民权县| 凯里市| 屯留县| 阳新县| 葵青区| 北碚区| 修武县| 布拖县| 兴义市| 遂川县| 池州市| 东源县| 松潘县| 新邵县| 安乡县| 循化| 兴宁市| 墨脱县| 万源市| 古丈县| 黄浦区| 古交市| 囊谦县| 枝江市| 布尔津县| 崇礼县| 剑阁县| 洪洞县|