python中的錯誤和異常處理
阿新 • • 發佈:2019-01-23
使用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