8.3 異常處理
編寫可以處理可選擇的異常是可能的。 看看下面的例子,要求使用者輸入一個合法的整數類型,但是允許使用者打斷程式()用control-c或者其他動作系統支援的語言;注意一個使用者產生的終端會引發一個keyboardInterrupt 異常。
>>> while True:
... try:
... x = int(input("Please enter a number: "))
... break
... except ValueError:
... print("Oops! That was no valid number. Try again...")
...
Try語句如下工作:
l 首先,執行try句子裡面內容。(在try和except關鍵字之間的語句)
l 如果沒有異常發生,except語句就會跳過,try語句執行就結束。
l 如果在執行try語句過程中異常發生,剩下的語句就會跳過。 如果發生的 異常名稱和except關鍵字之後的異常相同, except語句就會執行,它時在try語句之後執行的。
l 如果發生沒有與except語句異常名稱相匹配的異常,它就傳遞給try語句外部。如果發現沒有處理的異常,就會拋出沒有處理的異常並且列印出如上面的異常資訊。
l
為了具體處理不同的異常,Try語句可以包含許多except語句。在但最多隻有一個異常處理。 處理器只能處理髮生髮生在相應的try語句中的異常。而不是相同的try中發生的其他異常。
一個execpt可能作為一個括弧括起來的元組裡,命名多個異常,例如:
... except (RuntimeError, TypeError, NameError):
... Pass
返回欄目頁:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/extra/
最後一個except子句可以省略異常名稱,以作為萬用字元使用。你需要謹慎使用這個。因為用這種方式很容易隱藏一個實際的程式錯誤。可以使用這種方法列印一條錯誤資訊,然後重新拋出異常。(允許調用這處理這個異常)
import sys
try:
f = open(’myfile.txt’)
s = f.readline()
i = int(s.strip())
except IOError as err:
print("I/O error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
Raise
在try ... 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()
使用else子句要比在try後面添加代碼要好,因為它可以避免額外的捕捉異常。它們並不是由try... :keyword:except語句保護的代碼所拋出。
當一個異常發生時,它可能有相關聯的值,也可以成為異常的參數。參數的存在與類型依賴於異常的類型。
Except語句可以在異常名稱後描述一個變數。這個變數與包含參數的異常執行個體相互綁定。為了方便起見,異常執行個體定義了_str_()方法以至於不需要調用參數.args可以直接列印參數。你也可以拋出異常前先執行個體化它,然後給它添加任何想要的屬性。
>>> try:
... raise Exception(’spam’, ’eggs’)
... except Exception as inst:
... print(type(inst)) # the exception instance
... print(inst.args) # arguments stored in .args
... print(inst) # __str__ allows args to be printed directly,
... # but may be overridden in exception subclasses
... x, y = inst.args # unpack args
... print(’x =’, x)
... print(’y =’, y)
...
<class ’Exception’>
(’spam’, ’eggs’)
(’spam’, ’eggs’)
x = spam
y = eggs
如果異常還有參數,對於沒處理的異常將會列印在異常資訊中的最後一部分中。
異常處理器不僅僅處理那些try子句中立刻發生的異常,也會處理那些try子句中調用的函數內部發生的異常:例如::
>>> def this_fails():
... x = 1/0
...
>>> try:
... this_fails()
... except ZeroDivisionError as err:
... print(’Handling run-time error:’, err)
...
處理運行時的錯誤: int division or modulo by zero