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文件去
复制代码

关于完整代码能够加入小册子交流群获取。更多的量化交易内容欢迎你们订阅小册子阅读

相关文章
相关标签/搜索