查看原文
其他

Python中的异常处理

爬虫俱乐部 Stata and Python数据分析 2023-10-24

本文作者:孟孔,中南财经政法大学金融学院

本文编辑:胡艺粼

技术总编:孙一博

Stata and Python 数据分析

     由李春涛教授团队成员司海涛薛原编写的《Stata正则表达式及其在财务数据中的应用》终于和大家见面啦!爬虫俱乐部特此为大家准备了100本,即日起购买爬虫俱乐部课程,可赠送本书一本,先到先得!


购书链接:

爬虫俱乐部Stata基础课程Stata进阶课程Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~
01引言

异常是程序执行过程中出现的错误,解释器无法继续执行了,出现了一些错误的提示,逻辑错误、用户输入不合法等情况都会引发异常,我们可以采取适当的方法,利用异常处理机制及时捕获与处理异常,使得写出来的程序更加安全与稳定。

02
异常的类别汇总

基于BaseException类的异常可以分为SystemExit、KeyboardInterrupt、GeneratorExit、Exception。其中Exception常规错误基类衍生18种子类异常,子类异常下面仍有众多类型异常,属于重点关照的父类异常,而其他三类无子类异常。

BaseException 所有异常的基类 +-- SystemExit 解释器请求退出 +-- KeyboardInterrupt 用户中断执行(通常是输入^C) +-- GeneratorExit 生成器(generator)发生异常来通知退出 +-- Exception 常规错误的基类 +-- StopIteration 迭代器没有更多值 +-- StopAsyncIteration 必须通过异步迭代器对象的__anext__()方法引发以停止迭代 +-- ArithmeticError 所有数值计算错误的基类 +-- AssertionError 断言语句失败 +-- AttributeError 对象没有这个属性 +-- ImportError 导入失败 ..........................................以上仅列出部分异常类型,全部异常类型可参考博客:Python内置异常类型全面汇总(https://www.jb51.net/article/187518.htm)03异常的写法格式基本的异常写法是try/except。正常情况下执行try下方代码,如果出现异常,则会跳转到相应的代码下执行;如果整个过程没有发生异常,则会执行else代码;最后必然要执行finally代码,else和finally均属于选择项。
try: 可能发⽣错误的代码except A: 如果出现异常A执⾏的代码except B: 如果出现异常B执⾏的代码except: 如果出现异常A、B以外的异常执⾏的代码else: 没有异常的时候执⾏的代码finally: ⽆论是否异常都要执⾏的代码通过计算除式来简单了解一下try/except的用法。
try: a = int(input("输入被除数:")) b = int(input("输入除数:")) c = a / b print("除式计算结果为:", c )except (ValueError): print("存在异常,异常类型为传入无效的参数")else: print("无其他异常")finally: print("end")当我们输入b分母为非零的正数时,程序正常结束;而输入b=a时,则会报错,可以看到finally无论是否发生异常均执行。

04捕获指定异常与异常描述捕获指定异常的基本格式同样是try/expect,基本格式如下:
try: 可能发⽣错误的代码except 异常类型:    如果捕获到该异常类型执行的代码如果尝试执行的代码的异常类型和要捕获的异常类型不⼀致,则无法捕获异常。一般try下方只放一行尝试执行的代码。对基本格式进行拓展。阐述捕获多个和所有关于异常的描述。
  • 捕获多个异常的描述信息
提取出现异常时python对该异常的描述,捕获多个异常时,可以把要捕获的异常类型的名字,放到except后,并使用元组的方式进行书写,设置as别名。
try: 可能发⽣错误的代码except (异常A, 异常B) as result: print(result)
  • 捕获所有异常描述信息
可以使用Exception异常的父类替换(异常A, 异常B)子类异常。因为只有Exception存在子类异常,其他三类父类异常均不存在子类异常,所以Exceptio基本可以涵盖python的所有异常。
try: 可能发⽣错误的代码except Exception as result: print(result)

我们仍接着上面的除式进行案例讲解,输入分母为0和a,直接输出关于所发生异常的描述。

try: a = int(input("被除数:")) b = int(input("除数:")) c = a / b print("除式计算结果为:", c)except (ZeroDivisionError,ValueError) as result: print(result)finally: print("end")

05抛出异常我们通常使用raise [Exception [, args ]]语句触发异常,语句中Exception是父类异常中的任一子类,args是异常参数。
passward = str(12345)if len(passward) != 6: raise ValueError("传入无效的参数")

当passward的长度为5,进入if判断语句,长度不为6则抛出异常。

06
assert断言常常使用assert判断表达式,在结果为false时触发异常,相当于一个if语句,也可将断言视为debug工具。
基本语法格式 assert 表达式 [, 参数]assert Trueassert False

07自定义异常通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是通过直接或间接的方式继承自Exception类。
# ⾃定义异常类class 异常类名(Exception): def __init__(self,参): self.参 = 参# 设置抛出异常的描述信息def __str__(self): return ...#设置程序def 程序名():# 抛出异常 raise 异常类名()# 捕获异常 except Exception as result...#执行程序程序名()我们通过一个输入银行卡密码的案例,实操理解自定义异常。当密码长度不足6位时,则报异常,即抛出自定义异常,捕获该异常。
# 定义异常,设置魔法方法和异常描述class PasswardInputError(Exception): def __init__(self,length,local_length):        self.length = length        #用户输入的密码 self.local_length = local_length #要求的长度# 异常描述 def __str__(self): return f'您输入的密码长度是:{self.length},密码长度不符,请重新输入!!'def ProcessStart(): while True: #设置循环 直到输入成功 try: passward = input("客官,请输入您的六位数密码:") if len(passward) != 6: raise PasswardInputError(len(passward), 6) #抛出异常 if len(passward) == 6: print(f'客官,输入成功!请牢记您的密码{passward}') break except Exception as result: print(result)# 程序启动ProcessStart()

通过自定义异常的方式,我们将其return为您输入的密码长度是:{self.length},密码长度不符,请重新输入!!,直观易懂。

关于Python异常处理的讲解结束,欢迎大家评论区留言,共同讨论更加高效的异常处理方法,让代码丝滑起来skr~skr~skr~

END重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。



对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!




往期推文推荐           cntrade的隐藏功能:获取每年年末上市公司数量
       Python交互式数据可视化——酷炫的Altair库        hk系列命令(3)—— hktrade       hk系列命令(2)—— hkar hk系列命令(1)—— hkstock 超好用的字符串方法 基于Python的假设检验实现 Stata与MySQL交互--基础操作     Jupyter Notebook中的魔术命令《Stata正则表达式》由中国金融出版社出版发行    匿名函数lambda到底怎么用? Stata绘图系列—NBER Working paper仿图 Camelot:从PDF中提取表格数据 Stata之计算财务指标——融资约束 列表生成式|让你的代码更简洁 Stata绘图系列——玩转绘图通用选项之坐标轴 玩转地图的好帮手--pyecharts 爬虫俱乐部又又又输送了一位研究助理!!!【数据分析】一文教你玩转DataFrame     关于我们 

   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存