python學習筆記異常處理(七)

異常處理

異常處理是工作中編寫代碼必須要完成的內容,對於不符合預期的操作,程序總會出現異常情況,而對異常情況能夠妥善處理,是保證程序穩定性的關鍵。

>>> f = input("filename")
filename/hone/a.py
>>> ff = open(f)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/hone/a.py'

以上代碼,用戶輸入的文件不存,系統拋出文件不存在的異常,類型是FileNotFoundError。

python異常類型有很多,常見的類型如下:

  • NameError:訪問一個未定義的變量
  • SyntaxError:語法錯誤,嚴格上講是程序的錯誤
  • IndexError:對於一個序列,訪問的索引操作範圍
  • KeyError:訪問一個不存在的字典key
  • ValueError:傳入無效的參數
  • AttribueError:訪問類對象中不存在的屬性

異常處理

如果出現了異常,我們不可以直接將異常拋給用戶,應該使用python的異常處理方法來捕獲並處理異常,處理方法爲try,except,finally三個關鍵字。

try:
    有可能拋出異常的代碼
except 異常類型名稱:
    處理代碼
except 異常類型名稱:
    處理代碼

except可以有多個,每個處理不同類型的異常,也可以不寫任何異常類型名稱,則會處理所有捕獲的異常。

以上代碼使用異常處理改進:

>>> filename = input('filename')
filename/home/a.py
>>> try:
...     f = open(filename)
...     print(f.read)
...     f.close()
... except FileNotFoundError:
...     print('File not found')
... 
File not found

finally關鍵字是用來進行清理工作,經常和except一起使用,即無論是正常還是異常,finally塊裏面的代碼都會執行。
如果一個文件處理的程序中異常出現在 f.write() 向文件中寫入數據的時候,就無法執行 close 操作,使用 finally 可以保證無論 try 代碼塊中的代碼是否拋出異常,都能夠執行 finally 代碼塊裏的內容,保證文件被正常關閉。

修改上述的程序如下,改爲寫入操作,引入 finally 保證文件可以被正常關閉:

filename = '/etc/protocols'
f = open(filename)
try:
    f.write('shiyanlou')
except:
    print("File write error")
finally:
    print("finally")
    f.close()

程序運行的結果:

File write error
finally

表示雖然異常,但仍然執行到了 finally 代碼塊。

這裏需要說明下拋出異常的原因是以只讀的模式打開了一個文件,但嘗試向文件中寫入內容,所以會拋出異常。另外 except: 這個語句後不寫任何參數,表示將處理所有 try 代碼塊中拋出的異常。

拋出異常
如果我們希望在程序執行過程中拋出一些異常,該如何操作呢?可以使用 raise 語句。

raise 異常名稱
例如,我們在代碼裏希望拋出一個 ValueError,直接使用:

raise ValueError()
外部的代碼就可以使用 except ValueError 進行捕獲和處理了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章