Python量化交易基礎講堂-try_except異常處理機制

《Python實戰-構建基於股票的量化交易系統》小冊子主要側重於 Python 實戰講解,但在內容設計上提供了前置基礎章節幫助讀者快速掌握基礎工具的使用。同時咱們會持續更新一些關於Python和量化相關擴展文章,幫助你們夯實基礎和增值學習效果。目前已經推出以下文章:編程

本次專欄篇咱們來介紹Python中的try_except異常處理機制。bash

在Python編程中不可避免的會出現錯誤,在調試階段出現語法之類的錯誤時,Pycharm會在Debug窗口提示錯誤,可是程序在運行時因爲內部隱含的問題而引發錯誤,會致使程序終止執行。好比如下例程中,使用urllib庫打開URL時因爲網絡問題而發生了錯誤:網絡

import urllib.request
req = urllib.request.urlopen('http://www.baidu.com')
print(req.read())
Traceback (most recent call last):
……
TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
複製代碼

在Python中出現解釋器沒法正常處理的程序時會引起異常。若是要避免程序在異常發生時結束運行,那麼一般使用異常處理語句捕捉異常,再經過其餘的邏輯代碼讓程序繼續運行。異常處理語句爲try/except,它的基本語法結構以下:工具

try:
    < 語句 >  # 運行代碼
except  [(Error1, Error2, ...)[as e]]:
    < 語句 >  # 若是在try中引起了'Error1'異常
except  [(Error3, Error4, ...)[as e]]:
    < 語句 >  # 若是在try中引起了'Error3'異常
except:
    < 語句 >  # 若是在try中引起了其餘異常

複製代碼

當Python解釋器在執行 try 中的代碼時出現異常,Python 解釋器會依次判斷該異常對象是不是 except 塊後的異常類或其子類的實例,根據該異常的類型尋找能處理該異常對象的 except 塊,若是找到合適的 except 塊,則把該異常對象交給該 except 塊處理。若是 Python 解釋器找不到捕獲異常的 except 塊,則程序運行終止,Python 解釋器也將退出。學習

從 try except 的基本語法格式能夠看出,try 塊僅有一個,但 except 代碼塊能夠有多個,這是爲了針對不一樣的異常類型提供不一樣的異常處理方式,好比如下例程中,分別定義了浮點計算錯誤FloatingPointError異常和輸入/輸出操做失敗IOError異常:ui

try:
    import urllib.request
    req = urllib.request.urlopen('http://www.baidu.com')
    print(req.read())
except FloatingPointError:
    print("Capture FloatingPointError")
except IOError:
    print("Capture IOError")
except Exception:
    print("Capture Error")
except:
    print("Capture Error")

複製代碼

以上程序針對 FloatingPointError、IOError類型的異常,提供了專門的異常處理邏輯。該程序運行時的異常處理邏輯可能有以下幾種情形:url

  • 若是在運行該程序時出現浮點計算錯誤,Python 將調用 FloatingPointError 對應的 except 塊處理該異常。
  • 若是在運行該程序時出現輸入/輸出操做失敗,Python 將調用IOError對應的 except 塊處理該異常。此處解釋器會執行IOError的異常處理。
  • 若是在程序運行時出現其餘異常,Python 能夠調用 Exception 對應的 except 塊處理該異常。固然except後面也能夠不指定任何異常類。

在語法中的[]內爲可選內容,因而能夠有如下幾種形式:spa

  • except 後不指定具體的異常名稱,表示要捕獲全部類型的異常。
try:
    < 語句 >  # 運行代碼
except:
    < 語句 >  # 若是在try中引起了其餘異常
複製代碼
  • except 後指定具體的異常名稱,表示捕獲指定類型的異常。好比 Error一、Error二、Error三、Error4分別表示各自的 except 塊能夠處理異常的具體類型。
try:
    <語句>    # 運行代碼
except  Error1:
    <語句>    # 若是在try中引起了'Error1'異常
try:
    < 語句 >  # 運行代碼
except (Error2,Error3):
    < 語句 >  # 若是在try中引起了'Error2和Error3'異常 
複製代碼
  • [as e] 表示將異常類型賦值給變量 e,以便於在 except 塊中調用異常類型。全部的異常對象都包含了以下幾個經常使用屬性和方法:設計

    args:該屬性返回異常的錯誤編號和描述字符串。調試

    errno:該屬性返回異常的錯誤編號。

    strerror:該屬性返回異常的描述字符串。

    with_traceback():經過該方法可處理異常的傳播軌跡信息。

try:
    import urllib.request
    req = urllib.request.urlopen('http://www.baidu.com')
    print(req.read())
except FloatingPointError:
    print("Capture FloatingPointError")
except IOError as e:
    print("Capture IOError")
    print(e.args) # 訪問異常的錯誤編號和詳細信息
    print(e.errno) # 訪問異常的錯誤編號
    print(e.strerror) # 訪問異常的詳細信息
except:
    print("Capture Error")
(TimeoutError(10060, 'A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond', None, 10060, None),)
None
None 
複製代碼

若是要查看更詳細的異常信息,能夠導入traceback模塊,使用print_exc()打印異常信息。print_exc()還能夠接受file參數直接寫入到一個文件。好比:

traceback.print_exc(file=open('except.txt', 'w+')) # 寫入到except.txt文件去
複製代碼

關於完整代碼能夠加入小冊子交流羣獲取。更多的量化交易內容歡迎你們訂閱小冊子閱讀

相關文章
相關標籤/搜索