1. 程式人生 > >python中的錯誤和異常處理

python中的錯誤和異常處理

使用try except處理異常

try:
    print 10 / 0
except ZeroDivisionError, e:
    print "catched a ValueError:",e

上面的程式碼中,被除數是0,會引發ZeroDivisionError,執行上面的程式碼:

catched a ValueError: integer division or modulo by zero

使用try except處理多個異常

如果一段程式碼可能跑出多個異常,try except也是可以處理的, 下面程式碼用來讀取一個檔案,並轉換成整型輸出

try:
    f = open
("d:/num.txt") line = f.read(2) num = int(line) print "read num=%d" % num except IOError, e: print "catch error==:", e except ValueError, e: print "catch error==:", e

如果檔案不存在,會捕捉到下面異常:

catch error==: [Errno 2] No such file or directory: 'd:/num.txt'

另外,如果讀取的字串不能轉換成整型,則會捕捉到ValueError

catch error==: invalid literal for int() with base 10: 'd3'

使用try-except-else捕獲異常

try:
    ....
except:
    ....
else:
    ....

如果沒有異常,執行else中的程式碼

try:
    f = open("d:/num.txt")
    line = f.read(2)
    num = int(line)
    print "read num=%d" % num
except IOError, e:
    print "catch error==:"
, e except ValueError, e: print "catch error==:", e else: print "no error happend"

此時,執行效果如下:
這裡寫圖片描述

try-finally捕獲異常

try:
    try_code
finally:
    do_finally

上面的try–finally按照如下規則執行:

  • 如果try語句沒有捕獲錯誤,do_finally程式碼執行
  • 如果try語句捕獲錯誤,程式首先執行do_finally語句,然後將捕獲到的錯誤交給python直譯器處理
try:
    f = open("d:/num.txt")
    line = f.read(2)
    num = int(line)
    print "read num=%d" % num
except IOError, e:
    print "catch error==:", e
finally:
    print "f close()"
    f.close()

上面的程式,當讀取到非法字串時候,此時轉換成整型會出錯,此時finally語句塊先執行,然後,將異常交給python直譯器處理
這裡寫圖片描述

使用try-except-else-finally

try:
    try_code
except:
    except_code
else:
    else_code
finally:
    finally_code

上面的程式碼塊會按照下面的規則來執行:

  • 若try語句沒有捕獲異常,執行完try程式碼段後,執行else程式碼段,最後執行finally
  • 若try捕獲異常,首先執行except處理錯誤然後finally

with語句

with context [as var]:
    with_code
  • with語句用來代替try-except-finally語句
  • context表示式返回是一個物件
  • var用來儲存context返回物件,單個返回值或者元組
  • with_code使用var變數來對context返回物件進行操作
with open("d:/num.txt") as f:
    for line in f.read():
        print line
print "f is closed :",f.closed

此時執行效果如下:
這裡寫圖片描述

使用raise語句丟擲異常

自定義異常

class FileError(IOError):
    pass

try:
    raise FileError, "this is a fileerror"
except FileError, e:
    print e

此時執行會列印如下:

this is a fileerror