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)相关推荐

  1. python 期货交易_Python期货量化交易基础教程(1)

    (本教程基于天勤量化平台) 前言 语言: 人与人在沟通的时候,需要靠语言传递彼此的"意思",没有语言,人们就无法相互理解对方,语言是承载人们的"意思".&quo ...

  2. python 期货交易_Python期货量化交易基础教程(3)

    3.函数式编程: 我们在用Python程序处理实际问题时,有些代码可能需要重复使用,如果每次使用都要编写一遍代码会耗费不少工作量,我们可以把这部分代码编写成函数,每次调用函数就能完成工作,不用再重复编 ...

  3. python如何期货交易_Python期货量化交易基础教程(15)

    15.pandas模块: K线.tick数据都是pandas.DataFrame类型,因此我们有必要介绍下pandas模块. Pandas 的主要数据结构是 Series(一维数据)与 DataFra ...

  4. python应用于期货_Python期货量化交易基础教程(17)

    16.14.异步任务: 16.14.1.使用协程任务: 函数create_task()用来创建协程任务,并将任务加入事件循环以实现异步并发. wait_update()不能用在协程中,若在协程中等待业 ...

  5. python量化交易入门教程_Python期货量化交易基础教程(9)

    9.模块.包和文件: 复杂的程序设计,不可能把所有的代码都写在一个文件里,也不可能把所有文件都放在同一个文件夹里. 9.1.模块 : 模块就是以".py"为扩展名的文件,一个文件中 ...

  6. python如何期货交易_Python期货量化交易实战

    版 权 版权声明 内容提要 序言1 序言2 资源与支持 第1章 Python的基本语法 技巧1 [概念]Python的诞生与发展 技巧2 [操作]安装Python的基本环境 技巧3 [操作]Pytho ...

  7. python期货量化交易实战_Python期货量化交易实战

    ·了解交易的规则与数据指标,学习正确的金融算法·基于真实的数据进行回测和分析,了解期货交易的内涵·循序渐进的案例式教学,按部就班地操作就能上手·基于Python 3.7进行分析,提供示例代码,可在异步 ...

  8. python 期货交易接口_量化交易 – 期货CTP接口与程序化(量化交易)的对接 1

    很多人写CTP都是为了自动交易. 费好大劲, 对多个策略进行历史测试.实盘运行: 能随意编写策略,想改就改,想加就加: 测试时,要能随意选择合约.周期.时间范围.参数范围,能随意设置滑点量.手续费.盘 ...

  9. Python期货量化交易中常用的数据类型有哪些?

    1 常用内置常量 Python解释器在启动时会创建None.True.False三个常量,None表示"无",True表示"真",False表示"假& ...

最新文章

  1. PyCharm Python3操作数据库MySQL增删改查
  2. java2的7次方怎么表示_python编程解方程第二弹:10行代码解二次方程(纯字符)...
  3. ubuntu14.04.03 vsftpd
  4. 15 篇最新 AI 论文来袭!NLP、CV...人人有份 | 本周值得读
  5. c语言 指针 数组还能这么用 ?
  6. 阿里云 超级码力在线编程大赛初赛 第3场 题目2. 房屋染色(DP)
  7. python如何监听toast提示信息_python 怎样获取toast?
  8. 推荐系统概述——《ML算法原理和实践》学习笔记
  9. 行测题练习(7-29)【1】
  10. 地址规范化--城市三级联动(layui) (A)
  11. 四分位数算法记录(含java代码实现)
  12. linux命令--netstat
  13. 000webhost提供 1500M免费空间 可绑顶级域名
  14. OpenGL ES FBO
  15. HTML canvas 输入文字,关于Canvas写字
  16. IP远程实施访问另一台电脑
  17. 智慧屏新品尝鲜:精致机身旗舰声画
  18. 苹果电脑切换任务管理器快捷键
  19. DirectX11--实现一个3D魔方(1)
  20. HTML5期末大作业:零食官网网站设计——美食零食官网(6页) html网页制作期末美食作业成品_小吃类网页设计期末作业

热门文章

  1. rtmp 时间戳问题
  2. 机器学习经典论文/survey合集
  3. php文字超链接怎么写,php 文本URL转换为超链接功能实例
  4. python用psf函数_Python 嵌套函数(高级用法)
  5. date 的基本使用 suse
  6. 编码最佳实践——Liskov替换原则
  7. linux 系统之三
  8. iOS提交应用至App Store流程及真机调试 一,证书、配置文件
  9. [EF Core]数据迁移(二)
  10. canvas三环加载进度条