欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python入門第8/10頁

 更新時間:2007年02月08日 00:00:00   作者:  

第八章 錯誤與例外
到現在為止我們只是提到了錯誤信息而沒有詳細討論,如果你運行了前面的例子可能已經看到了一些錯誤信息。至少有兩種不同錯誤:句法錯和例外錯(exceptions)。

8.1 句法錯
 句法錯也稱為語法分析錯,是你在學習Python的時候最可能犯的錯誤。 

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


語法分析器重復出錯行,并用一個小‘箭頭'指向行內最早發(fā)現錯誤的位置。錯誤是由箭頭前面的記號引起的(至少是在這里檢測到的)。在本例中,錯誤在關鍵字print處檢測到,因為它前面應該有一個冒號(“:”)。錯誤信息中顯示了文件名和行號這樣如果錯誤發(fā)生在一個腳本文件中你就知道到哪里去找。

8.2 例外
即使語句或表達式句法沒有問題,在試圖運行的時候也可能發(fā)生錯誤。運行時檢測到的錯誤叫做例外,這種錯誤不一定必然是致命的:你很快就會學到如何在Python程序中處理例外。然而,多數例外不能被程序處理,這是會產生錯誤信息,如:

>>> 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


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

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

 庫參考手冊列出了內置例外和其含義?!?nbsp;

8.3 例外處理
 可以編程序來處理選定的例外。請看下面的例子,顯示一些浮點數的倒數: 

>>> 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語句是這樣工作的:

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

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


最后一個except子句可以省略例外名,作為一個通配項。這種方法要謹慎使用,因為這可能會導致程序實際已出錯卻發(fā)現不了。

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

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


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

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


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

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

>>> 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 產生例外
raise語句允許程序員強行產生指定的例外。例如: 

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


raise語句的第一個參數指定要產生的例外的名字。可選的第二參數指定例外的參數。  

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

>>> 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


許多標準模塊用這種方法報告自己定義的函數中發(fā)生的錯誤?!?nbsp;

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

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


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

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

相關文章

  • Python 中下劃線的幾種用法(_、_xx、xx_、__xx、__xx__)

    Python 中下劃線的幾種用法(_、_xx、xx_、__xx、__xx__)

    本文主要介紹了Python 中下劃線的幾種用法(_、_xx、xx_、__xx、__xx__),詳細的介紹了這幾種下劃線的用處,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • 解決Python3中二叉樹前序遍歷的迭代問題

    解決Python3中二叉樹前序遍歷的迭代問題

    二叉樹是分層數據結構,其中每個父節(jié)點最多有 2 個子節(jié)點,在今天的文章中,我們將討論一個在大量技術編碼面試中出現的重要主題,對Python二叉樹遍歷相關知識感興趣的朋友一起看看吧
    2022-09-09
  • Python 提取dict轉換為xml/json/table并輸出的實現代碼

    Python 提取dict轉換為xml/json/table并輸出的實現代碼

    這篇文章主要介紹了Python 提取dict轉換為xml/json/table并輸出的實現代碼,需要的朋友可以參考下
    2016-08-08
  • python使用pypdf2實現pdf文檔解密

    python使用pypdf2實現pdf文檔解密

    利用pypdf2完成pdf的解密,這里的事例是python3環(huán)境下的,當然python2下也可以運行,只需要修改名稱即可,文中通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • Python selenium+cookie實現免密登陸的示例代碼

    Python selenium+cookie實現免密登陸的示例代碼

    本文主要介紹了Python selenium+cookie實現免密登陸的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • python異常處理和日志處理方式

    python異常處理和日志處理方式

    今天小編就為大家分享一篇python異常處理和日志處理方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python及Pycharm安裝方法圖文教程

    Python及Pycharm安裝方法圖文教程

    這篇文章主要為大家詳細介紹了Python及Pycharm安裝方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Tensorflow實現多GPU并行方式

    Tensorflow實現多GPU并行方式

    今天小編就為大家分享一篇Tensorflow實現多GPU并行方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • 用python3教你任意Html主內容提取功能

    用python3教你任意Html主內容提取功能

    這篇文章主要介紹了用python3教你任意Html主內容提取功能,主要使用到了requests、lxml、json等模塊,文中逐一對這幾個模塊做了介紹,需要的朋友可以參考下
    2018-11-11
  • 常用的Python代碼調試工具總結

    常用的Python代碼調試工具總結

    今天給大家?guī)淼氖顷P于Python的相關知識,文章圍繞著Python代碼調試工具展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評論