python 期货交易_Python期货量化交易基础教程(8)
8、错误和异常处理
Python中常见的错误有两类,一是语法错误,二是异常。
语法错误是违反了Python语法规则,导致代码无法执行。
异常是语法没有错误,但在执行过程中因为代码逻辑问题又发生了故障。
8.1、try语句:
Python中用try语句处理异常。
我们先从示例开始:
>>> if:
File "", line 1
if:
^
SyntaxError: invalid syntax
>>>
此例是一个不完整的if语句,报了语法错误:SyntaxError,具体内容为invalid syntax,语法错误在编写代码时就应当避免。
再看下一个例子:
>>> def func(a):
... print(a+5)
...
>>> a='xyz'
>>> func(a)
Traceback (most recent call last):
File "", line 1, in
File "", line 2, in func
TypeError: can only concatenate str (not "int") to str
>>> func(b)
Traceback (most recent call last):
File "", line 1, in
NameError: name 'b' is not defined
>>>
此例定义一个函数func和一个变量a,然后调用func并把a作为参数传入,语法没有错误,但a是字符串不能与整型相加,产生了逻辑错误,所以抛出了异常类型错误:TypeError,具体内容为can only concatenate str(not"int") to str。调用func(b)由于b没有定义,所以抛出了异常名字错误:NameError,具体内容为name 'b'is not defined
我们先用一简单的try语句捕捉上例异常,因为我们已经知道了异常是类型错误和名字错误,所以可如下写:
>>> try :
... func(a)
... func(b)
... except TypeError:
... print('a值不能运算')
... except NameError:
... print('b未定义')
...
a值不能运算
>>>
try后跟可能抛出异常的语句func(a)、func(b),except后跟异常名,表示捕捉指定异常,try按字面意思就是尝试运行其后的语句,如果发生异常就由后面的except捕捉。此例有两个异常,所以用两个except捕捉,指定的异常是TypeError和NameError,捕捉到了异常则执行该异常下的语句块,输出结果只有'a值不能运算',说明当捕捉到一个异常后,其余的异常不再捕捉,因为其余可能产生异常的语句没有再执行的意义。
如果多个异常会用到同样的处理语句,则多个异常可以放在同一个except后面,例如:
>>> try :
... func(a)
... func(b)
... except (TypeError,NameError):
... print('a值不能运算或b值未定义')
...
a值不能运算或b值未定义
>>>
表示捕捉异常TypeError或NameError。
我们可以用as语句获取异常的具体内容,并将内容赋值给变量,如下:
>>> try :
... func(a)
... except TypeError as T:
... print('a值不能运算')
... print(T)
...
a值不能运算
can only concatenate str (not "int") to str
>>>
用as语句把TypeError的具体内容赋值给T,再输出T,即:can only concatenate str(not"int") to str
如果except后跟Exception,则捕捉所有的常规异常错误,例如:
>>> try :
... func(a)
... except Exception as e:
... print('捕捉到了异常:',e)
...
捕捉到了异常: can only concatenate str (not "int") to str
>>>
如果except后不跟异常名,则捕捉所有的异常,包括自定义的异常,例如:
>>> try :
... func(a)
... except :
... print('捕捉到了异常')
...
捕捉到了异常
>>>
但不建议这么做,因为不知道异常的具体内容是什么,难以对异常排查,所以except后至少应跟常规异常Exception,自定义的异常也应该继承Exception。
我们可用mro()函数查看异常的继承顺序,例如:
>>> TypeError.mro()
[, , , ]
>>>
从继承的顺序可知,异常的太上皇是BaseException,BaseException是所有异常的基类,BaseException一般用不到,常规错误基类Exception是皇上,用到Exception就够了,自定义的异常也应直接或间接继承Exception。通常对于不确定的异常用Exception捕捉,并放在最后捕捉,如果放前面则异常都被Exception截获,其后的异常不会再被检验。
更全异常捕捉示例:
>>> try :
... func(a)
... func(b)
... except TypeError as T:
... print('a值不能运算')
... print(T)
... except NameError as N:
... print('b值未定义')
... print(N)
... except Exception as e:
... print(e)
...
a值不能运算
can only concatenate str (not "int") to str
>>>
如果执行语句没有异常,try语句便可以执行结束了,但若需要在没有异常时也执行某些语句,可以用else语句执行,例如:
>>> a=4;b=6
>>> try :
... func(a)
... func(b)
... except TypeError as T:
... print('a值不能运算')
... print(T)
... except NameError as N:
... print('b值未定义')
... print(N)
... except Exception as e:
... print(e)
... else:
... print('没有异常')
...
9
11
没有异常
>>>
重新定义了a、b两个整数,则调用func(a)、func(b)便可正常执行,没有捕捉到异常则执行else语句。
最后,如果不管是否有异常,都要执行某些操作,比如释放资源,则用finally语句来执行,例如:
>>> try :
... func(a)
... func(b)
... except TypeError as T:
... print('a值不能运算')
... print(T)
... except NameError as N:
... print('b值未定义')
... print(N)
... except Exception as e:
... print(e)
... else:
... print('没有异常')
... finally:
... print('删除变量释放资源')
... del a,b
...
9
11
没有异常
删除变量释放资源
>>> a
Traceback (most recent call last):
File "", line 1, in
NameError: name 'a' is not defined
>>> b
Traceback (most recent call last):
File "", line 1, in
NameError: name 'b' is not defined
>>>
finally语句里删除了变量a、b,所以再调用a、b时报了NameError。以上便是try异常处理语句的基本结构。
8.2、raise语句:
我们除了让程序运行时自动抛出异常外,还可以按需要主动抛出异常,Python中用raise语句抛出指定的异常,并可向异常传递数据。
我们先看一个示例:
def func(a):
if type(a) != int:
raise ValueError
print(a+5)
函数中用if语句判断参数a,不是整型时抛出ValueError异常,执行效果如下:
>>> a='xyz'
>>> func(a)
Traceback (most recent call last):
File "", line 1, in
File "", line 3, in func
ValueError
>>> try:
... func(a)
... except ValueError as e:
... print(e,'不是整型')
...
不是整型
前面我们把字符串传入func由程序抛出异常时抛出的是TypeError,这次我们用raise主动抛出异常,则抛出了指定异常ValueError 。
ValueError并没有具体信息,所以print语句没有输出e的值,我们可以用raise抛出异常的同时传入数据,例如:
>>> def func(a):
... if type(a) != int:
... raise ValueError('不是整型')
... print(a+5)
...
>>> a='xyz'
>>> try:
... func(a)
... except ValueError as e:
... print(e)
...
不是整型
>>>
这次抛出的ValueError异常输出了具体信息“不是整型”。
8.3、自定义异常类:
我们可自己定义异常类,自定义异常应继承常规异常类Exception,例如:
class ZiError(Exception):
def __init__(self, arg):
self.arg = arg
def __str__(self):
return self.arg
自定义异常需要用raise语句主动抛出,且会自动调用__str__()函数返回异常具体信息,例如:
>>> def func(a):
... if type(a) != int:
... raise ZiError('不是整型') #抛出ZiError的实例,arg值为'不是整型'
... print(a+5)
...
>>> a='xyz';b=5
>>> try:
... func(b)
... func(a)
... except ZiError as z:
... print(z)
...
10
不是整型
>>>
func(b)可正常执行,但func(a)抛出自定义异常ZiError,并输出异常信息:不是整型。
python 期货交易_Python期货量化交易基础教程(8)相关推荐
- python 期货交易_Python期货量化交易基础教程(1)
(本教程基于天勤量化平台) 前言 语言: 人与人在沟通的时候,需要靠语言传递彼此的"意思",没有语言,人们就无法相互理解对方,语言是承载人们的"意思".&quo ...
- python 期货交易_Python期货量化交易基础教程(3)
3.函数式编程: 我们在用Python程序处理实际问题时,有些代码可能需要重复使用,如果每次使用都要编写一遍代码会耗费不少工作量,我们可以把这部分代码编写成函数,每次调用函数就能完成工作,不用再重复编 ...
- python如何期货交易_Python期货量化交易基础教程(15)
15.pandas模块: K线.tick数据都是pandas.DataFrame类型,因此我们有必要介绍下pandas模块. Pandas 的主要数据结构是 Series(一维数据)与 DataFra ...
- python应用于期货_Python期货量化交易基础教程(17)
16.14.异步任务: 16.14.1.使用协程任务: 函数create_task()用来创建协程任务,并将任务加入事件循环以实现异步并发. wait_update()不能用在协程中,若在协程中等待业 ...
- python量化交易入门教程_Python期货量化交易基础教程(9)
9.模块.包和文件: 复杂的程序设计,不可能把所有的代码都写在一个文件里,也不可能把所有文件都放在同一个文件夹里. 9.1.模块 : 模块就是以".py"为扩展名的文件,一个文件中 ...
- python如何期货交易_Python期货量化交易实战
版 权 版权声明 内容提要 序言1 序言2 资源与支持 第1章 Python的基本语法 技巧1 [概念]Python的诞生与发展 技巧2 [操作]安装Python的基本环境 技巧3 [操作]Pytho ...
- python期货量化交易实战_Python期货量化交易实战
·了解交易的规则与数据指标,学习正确的金融算法·基于真实的数据进行回测和分析,了解期货交易的内涵·循序渐进的案例式教学,按部就班地操作就能上手·基于Python 3.7进行分析,提供示例代码,可在异步 ...
- python 期货交易接口_量化交易 – 期货CTP接口与程序化(量化交易)的对接 1
很多人写CTP都是为了自动交易. 费好大劲, 对多个策略进行历史测试.实盘运行: 能随意编写策略,想改就改,想加就加: 测试时,要能随意选择合约.周期.时间范围.参数范围,能随意设置滑点量.手续费.盘 ...
- Python期货量化交易中常用的数据类型有哪些?
1 常用内置常量 Python解释器在启动时会创建None.True.False三个常量,None表示"无",True表示"真",False表示"假& ...
最新文章
- PyCharm Python3操作数据库MySQL增删改查
- java2的7次方怎么表示_python编程解方程第二弹:10行代码解二次方程(纯字符)...
- ubuntu14.04.03 vsftpd
- 15 篇最新 AI 论文来袭!NLP、CV...人人有份 | 本周值得读
- c语言 指针 数组还能这么用 ?
- 阿里云 超级码力在线编程大赛初赛 第3场 题目2. 房屋染色(DP)
- python如何监听toast提示信息_python 怎样获取toast?
- 推荐系统概述——《ML算法原理和实践》学习笔记
- 行测题练习(7-29)【1】
- 地址规范化--城市三级联动(layui) (A)
- 四分位数算法记录(含java代码实现)
- linux命令--netstat
- 000webhost提供 1500M免费空间 可绑顶级域名
- OpenGL ES FBO
- HTML canvas 输入文字,关于Canvas写字
- IP远程实施访问另一台电脑
- 智慧屏新品尝鲜:精致机身旗舰声画
- 苹果电脑切换任务管理器快捷键
- DirectX11--实现一个3D魔方(1)
- HTML5期末大作业:零食官网网站设计——美食零食官网(6页) html网页制作期末美食作业成品_小吃类网页设计期末作业