回味Python2.7——筆記3
阿新 • • 發佈:2017-07-23
iter 關鍵字 未處理 bsp 捕獲 clas 提示信息 ted finally
一、錯誤和異常
1、異常處理
>>> while True: ... try: ... x = int(raw_input("Please enter a number: ")) ... break ... except ValueError: ... print "Oops! That was no valid number. Try again..." ...
try
語句按如下方式工作:
- 首先,執行 try 子句 (在
try
和except
關鍵字之間的部分)。 - 如果沒有異常發生, except
try
語句執行完畢後就被忽略了。 - 如果在 try 子句執行過程中發生了異常,那麽該子句其余的部分就會被忽略。如果異常匹配於
except
關鍵字後面指定的異常類型,就執行對應的except
子句。然後繼續執行try
語句之後的代碼。 - 如果發生了一個異常,在
except
子句中沒有與之匹配的分支,它就會傳遞到上一級try
語句中。如果最終仍找不到對應的處理語句,它就成為一個 未處理異常 ,終止程序運行,顯示提示信息。
一個 try
語句可能包含多個 except 子句,分別指定處理不同的異常。至多只會有一個分支被執行。異常處理程序只會處理對應的 try 子句中發生的異常,在同一個 try
語句中,其他子句中發生的異常則不作處理。一個 except 子句可以在括號中列出多個異常的名字,例如:
... except (RuntimeError, TypeError, NameError): ... pass
最後一個 except 子句可以省略異常名稱,以作為通配符使用。
while True: try: x=input(‘please enter the first number:‘) y=input(‘please enter the second number:‘) print 1.*x/y except: print ‘something wrong happened! enter again!‘ else: break
please enter the first number:1 please enter the second number:w something wrong happened! enter again!2、 else
...
tryexcept
語句可以帶有一個 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
... except
意外的截獲本來不屬於它們保護的那些代碼拋出的異常。
3、拋出異常
raise
語句允許程序員強制拋出一個指定的異常。
>>> raise NameError(‘HiThere‘) Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: HiThere
4、 用戶自定義異常
在程序中可以通過創建新的異常類型來命名自己的異常(Python 類的內容請參見 類 )。異常類通常應該直接或間接的從 Exception
類派生
>>> class MyError(Exception): ... def __init__(self, value): ... self.value = value ... def __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(‘oops!‘) Traceback (most recent call last): File "<stdin>", line 1, in ? __main__.MyError: ‘oops!‘
5、finally
不管有沒有發生異常, finally子句 在程序離開 try
後都一定會被執行。當 try
語句中發生了未被 except
捕獲的異常(或者它發生在 except
或 else
子句中),在 finally
子句執行完後它會被重新拋出。 try
語句經由 break
,continue
或 return
語句退 出也一樣會執行 finally
子句
>>> def divide(x, y): ... try: ... result = x / y ... except ZeroDivisionError: ... print "division by zero!" ... else: ... print "result is", result ... finally: ... print "executing finally clause" ... >>> divide(2, 1) result is 2 executing finally clause >>> divide(2, 0) division by zero! executing finally clause >>> divide("2", "1") executing finally clause Traceback (most recent call last): File "<stdin>", line 1, in ? File "<stdin>", line 3, in divide TypeError: unsupported operand type(s) for /: ‘str‘ and ‘str‘
回味Python2.7——筆記3