1. 程式人生 > >回味Python2.7——筆記3

回味Python2.7——筆記3

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 子句 (在 tryexcept 關鍵字之間的部分)。
  • 如果沒有異常發生, 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
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 ... 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 捕獲的異常(或者它發生在 exceptelse 子句中),在 finally 子句執行完後它會被重新拋出。 try 語句經由 breakcontinuereturn 語句退 出也一樣會執行 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