Python基础(二十五):异常处理基础知识

异常处理基础知识

一、了解异常

当检测到⼀个错误时,解释器就无法继续执行了,反而出现了⼀些错误的提示,这就是所谓的"异常"。

例如:以 r方式打开⼀个不存在的文件。

open('test.txt', 'r')

二、异常的写法

1、语法

try:
    可能发⽣错误的代码
except:
    如果出现异常执⾏的代码

2、快速体验

需求:尝试以 r 模式打开文件,如果文件不存在,则以 w 方式打开。

try:
    f = open('test.txt', 'r')
except:
    f = open('test.txt', 'w')

3、捕获指定异常

语法

try:
    可能发⽣错误的代码
except 异常类型:
    如果捕获到该异常类型执⾏的代码

体验

try:
    print(num)
except NameError:
    print('有错误')

注意: 1. 如果尝试执行的代码的异常类型和要捕获的异常类型不⼀致,则无法捕获异常。 2. ⼀般try下方只放⼀行尝试执行的代码。

捕获多个指定异常

当捕获多个异常时,可以把要捕获的异常类型的名字,放到except 后,并使用元组的方式进行书写。

try:
    print(1/0)
except (NameError, ZeroDivisionError):
    print('有错误')

捕获异常描述信息

try:
    print(num)
except (NameError, ZeroDivisionError) as result:
    print(result)

捕获所有异常

Exception是所有程序异常类的父类。

try:
    print(num)
except Exception as result:
    print(result)

4、异常的else

else表示的是如果没有异常要执行的代码。

try:
    print(1)
except Exception as result:
    print(result)
else:
    print('我是else,是没有异常的时候执⾏的代码')

5、异常的finally

finally表示的是无论是否异常都要执行的代码,例如关闭文件。

try:
    f = open('test.txt', 'r')
except Exception as result:
    f = open('test.txt', 'w')
else:
    print('没有异常,真开⼼')
finally:
    f.close()

三、异常的传递

体验异常传递

需求:

1. 尝试只读方式打开test.txt⽂件,如果文件存在则读取⽂件内容,⽂件不存在则提示用户即可。

2. 读取内容要求:尝试循环读取内容,读取过程中如果检测到用户意外终止程序,则 except 捕获异常并提示用户。

import time
try:
    f = open('test.txt')
    try:
        while True:
            content = f.readline()
            if len(content) == 0:
                break
            time.sleep(2)
            print(content)
    except:
    # 如果在读取⽂件的过程中,产⽣了异常,那么就会捕获到
    # ⽐如 按下了 ctrl+c
        print('意外终⽌了读取数据')
    finally:
        f.close()
        print('关闭⽂件')
except:
    print("没有这个⽂件")

四、自定义异常

在Python中,抛出自定义异常的语法为 raise 异常类对象 。

需求:密码长度不足,则报异常(用户输入密码,如果输入的长度不足3位,则报错,即抛出自定义异常,并捕获该异常)。

class ShortInputError(Exception):
    def __init__(self, length, min_len):
        self.length = length
        self.min_len = min_len
    # 设置抛出异常的描述信息
    def __str__(self):
        return f'你输⼊的⻓度是{self.length}, 不能少于{self.min_len}个字符'

def main():
    try:
        con = input('请输⼊密码:')
        if len(con) < 3:
            raise ShortInputError(len(con), 3)
    except Exception as result:
        print(result)
    else:
        print('密码已经输⼊完成')
main()

本文转载于网络 如有侵权请联系删除

相关文章

  • JVM 致命错误日志(hs_err_pid.log)解读

    致命错误出现的时候,JVM生成了hs_err_pid<pid>.log这样的文件,其中往往包含了虚拟机崩溃原因的重要信息。因为经常遇到,在这篇文章里,我挑选了一个,并且逐段分析它包含的内容(文件可以在文章最后下载)。默认情况下文件是创建在工作目录下的(如果没权限创建的话JVM会尝试把文件写到/tmp这样的临时目录下面去),当然,文件格式和路径也可以通过参数指定,比如:java-XX:ErrorFile=/var/log/java/java_error%p.log复制这个文件将包括:触发致命错误的操作异常或者信号;版本和配置信息;触发致命异常的线程详细信息和线程栈;当前运行的线程列表和它们的状态;堆的总括信息;加载的本地库;命令行参数;环境变量;操作系统CPU的详细信息。首先,看到的是对问题的概要介绍:#SIGSEGV(0xb)atpc=0x03568cf4,pid=16819,tid=3073346448复制一个非预期的错误被JRE检测到,其中:SIGSEGV是信号名称0xb是信号码pc=0x03568cf4指的是程序计数器的值pid=16819是进程号tid=307334

  • 20个稀奇古怪的 JavaScript 表达式,你要挑战回答一下嘛

    本文GitHubhttps://github.com/qq449245884/xiaozhi已收录,有一线大厂面试完整考点、资料以及我的系列文章。JavaScript是一种非常容错的编程语言,许多在其他编程语言中不合法的表达式在JavaScript中都能正常工作。这导致了很多奇怪的代码。你想挑战它吗?挑战在这个挑战中,你将看到20个古怪表达式,并要猜出其输出结果。1.true+false复制2.**1.**复制3.[1,2,3]+[4,5,6]复制4.0.2+0.1===0.3复制5.10,2复制6.!!""复制7.+!![]复制8.true=="true"复制9.010-03复制10.""--""复制11.null+0复制12.0/0复制13.1/0===10**1000复制14.true++复制15.""-1复制16.(null-1)-"1"复制17.38*4343*2342+(“true”—0)复制18.5+!5+!!5复制19.[]+[1]+2复制20.1+2

  • 行为型之模板方法C++实现

    生活需求:去银行办理业务经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。模板方法:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。优势:封装了不变部分,扩展可变部分。在父类中提取了公共的部分代码,便于代码复用。缺点:对每个不同的实现都需要定义一个子类,会导致类的个数增加。父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。主要角色: (1)抽象父类:抽象方法:在抽象类中申明,由具体子类实现。具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。(2)具体子类:实现抽象类中所定义的抽象方法和钩子方法。具体案例:小码路最近买彩彩票中了30万,随机存入银行,朋友知道后,借了20万,真是树大招风呀,

  • 伟创力Flextronics EDI 850订单详解

    伟创力FlextronicsEDI项目,报文标准包括了X12和EDIFACT两种。本文着重讲述伟创力FlextronicsEDI项目中X12850报文解读。在此前的文章如何读懂X12报文中,我们对X12已经做了详细的介绍,大家可以以此为基础,深入了解850订单。850是X12国际标准报文规范下采购订单PurchaseOrder的报文类型代码。下图为伟创力FlextronicsEDIX12850示例报文转换前及经过知行之桥EDI系统转换后的结果对比图。我们从业务应用角度出发,一起来看看伟创力FlextronicsEDI项目中的850报文。伟创力FlextronicsX12850订单详解:ISA*00**00**FlextronicsISAQualifier*FlextronicsISAID*PartnerISAQualifier*PartnerISAID*130327*0026*U*00401*000108556*1*T*~ GS*PO*FlextronicsGSID*PartnerGS ID*0026*785*X*004010 ST*850*981262724 -850:报文类型为采购

  • 迅速入门二十一世纪必备技能包-R语言!

    当今,数据成为工作生活中不可或缺的一个重要组成部分。无论作为一名专业的数据分析师,亦或是各行各业的从业人员,面对形形色色的数据,你需要掌握一门专门用于统计分析建模的数据分析软件。本次有范君推荐给大家一款热门的数据分析软件-R语言。相对于其他工具,R语言有其独特的优势:一、对于初次接触一种工具的同学们,往往因为难以入门而导致最终的放弃。然而,R语言入门容易,面向人群无门槛,无论你是专业人员还是业余小白,通过几行简单的命令,便可以建立模型,或是绘制精美图像。二、支持广泛,作为开源软件,其后备团队庞大。用于分析建模的独立程序包众多,并且帮助文档齐全。三、功能强大,作为一门编程语言,应用它可以做到编程可以实现的一切模块,并且它所具备的不同领域的安装包几乎可以满足你一切统计工作的需求。R语言的优势和重要性十分明显,那么,我们立刻回到R语言入门的正题。经常有同学问,我如何学好一门语言?为何,你苦苦亲手编写数月代码,孜孜不倦的学习从入门到精通秘籍,到最后,确直接跳到放弃那一步?那么有范君告诉你,很多时候,问题在于你是否学以致用!这里我们将学习一门语言分为两个步骤:学、用。“学”阶段,需明确学什么?学

  • Angular路由里的resolve接口的使用方法

    https://angular.io/api/router/ResolveInterfacethatclassescanimplementtobeadataprovider.Adataproviderclasscanbeusedwiththeroutertoresolvedataduringnavigation.Theinterfacedefinesaresolve()methodthatisinvokedwhenthenavigationstarts.Therouterwaitsforthedatatoberesolvedbeforetherouteisfinallyactivated. 在route被activate之前,需要一些额外的数据。这些数据通过Angularroute接口提供的resolve方法提供。看个具体的例子。路由配置:constCUSTOM_ROUTES:Routes=[ {path:"custom/:id", component:RouteDemoComponent, data:{name:'jerry'}, canAct

  • GitLab版本控制与协作最佳实践

    2020版本控制最佳实践 增强团队协作的五种简单方法确定合适的分支策略频繁进行小的变更编写描述性的提交信息使用分支进行开发进行常规的代码审查行业的快速变化以及客户对新功能的需求不断增加,可能导致团队孤岛工作。应用程序开发需要速度和迭代,因此无缝协作是交付业务价值的必要条件。团队转向版本控制来简化协作并打破信息孤岛。版本控制协调软件项目中的所有更改,有效地跟踪源代码、文件和元数据的更改,以帮助团队快速协作并共享反馈,从而导致立即可行的变更。应用版本控制的团队可以无缝地协调工作、查看更改和管理交付,从而帮助他们专注于解决问题和交付价值。版本控制和协作不只是跟踪更改,还包括以下实践:使开发团队能够在分布式和异步环境中工作管理代码与工件的更改和版本启用代码审查和其他资产跟踪讨论变更的批准解决合并冲突和相关的集成问题版本控制入门可能是一项艰巨的任务,尤其是在面对瞬息万变的环境时。该电子书介绍了五个最佳实践,以帮助开发团队加强协作以进行迭代使用新功能并使用Git交付业务价值。1.确定合适的分支策略当来自不同专业和教育背景的团队成员一起工作时,工作流程可能会出现冲突。为了避免混乱的发展,领导者应确定

  • Matlab马尔可夫链蒙特卡罗法(MCMC)估计随机波动率(SV) 模型

    原文链接:http://tecdat.cn/?p=16708波动率是一个重要的概念,在金融和交易中有许多应用。这是期权定价的基础。波动率还使您可以确定资产分配并计算投资组合的风险价值(VaR)。甚至波动率本身也是一种金融工具,例如CBOE的VIX波动率指数。但是,与证券价格或利率不同,波动不能直接观察到。取而代之的是,它通常被衡量为来自证券或市场指数的收益或收益历史的统计波动。这种类型的度量称为已实现波动率或历史波动率。衡量波动率的另一种方法是通过期权市场,在该市场中,可以使用期权价格通过某些期权定价模型来得出基础证券的波动性。Black-Scholes模型是最受欢迎的模型。这种定义称为 隐含波动性。VIX基于隐含波动率。存在多种统计方法来衡量收益序列的历史波动率。较高频率的数据可用于计算低频收益的波动率。例如,使用日内收益率来计算每日波动率;使用每日收益来每周波动。人们还可以使用每日OHLC(开盘价,最高价,最低价和收盘价)来计算每日波动率。更多的学术方法包括ARCH(自回归条件异方差),GARCH(广义ARCH),TGARCH(阈值GARCH),EGARCH(指数GARCH)等。我

  • 测试开发进阶(二十五)

    痛点代码冗余极其严重,不符合优秀测开风格数据校验非常麻烦,且可复用性差编码没有统一的规范,杂乱无章的感觉写的代码非常多,不够简洁仅支持json格式的传参,不支持form表单传参仅能返回json格式的数据,其他类型不支持列表页视图没有分页,过滤,排序功能DjangoRESTframework在Django框架基础上,进行二次开发用于构建RestfulAPI简称为DRF框架或RESTfreamwork框架特性提供了强大的Serializer序列化器,可以高效地进行序列化与反序列化操作提供了丰富的类视图,Mixin扩展类,ViewSet视图集提供了直观的WebAPI界面多种身份认证和权限认证强大的排序,过滤,分页,搜索,限流等功能可扩展性,插件丰富安装$pipinstalldjangorestframework复制配置LearnDjango/settings.py中添加'rest_framework'INSTALLED_APPS=['django.contrib.admin','django.contrib.auth','

  • elasticsearch使用指南之桶聚合(Bucket)上篇

    微信公众号:[中间件兴趣圈] 作者介绍:《RocketMQ技术内幕》作者;本篇将开始介绍ElasticsearchBucket聚合(桶聚合)。BuketAggregations(桶聚合)不像metricsAggregations(度量聚合)那样计算字段上的度量,而是创建文档桶,每个文件桶有效地定义一个文档集。除了bucket本身之外,bucket聚合还计算并返回“落入”每个bucket的文档的数量。与度量聚合相反,桶聚合可以嵌套子聚合。这些子聚合将为它们的“父”桶聚合创建的桶进行聚合。ESBucketAggregations对标关系型数据库的(groupby)。首先我们来介绍桶聚合两个常用参数intervals、time_zone的含义。Intervals定义桶的间隔,其可选值如下:seconds 1,5,10,30的倍数。minutes 1,5,10,30的倍数。hours 1,3,12的倍数。days 1,7的倍数。months 1,3的倍数。years 1,5,10,20,50,100的倍数。TimeZone对于日期类型,可以使用time_zone来指定时区,可选值可以是相对IS

  • margin的重叠现象

    当两个相邻的普通元素设置margin时,则它们的间距并不是简单的外边距相加。 <!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="UTF-8"> <title>margin的重叠现象</title> </head> <style> #div1{ height:100px; margin-bottom:50px; background:blue; } #div2{ height:100px; margin-top:50px; background:green; } </style> <body> <divid="div1"></div> <divid="div2"></div> </body> </html>复制 效果如下: 两个div的高度是100px,明显间距不是50px+50px 原因是当两个相邻普通元素设置margin时,实际它们之间

  • 关于优先队列$priority\_queue$大小根堆、重载操作符的说明

    关于优先队列\(priority\_queue\)大小根堆、重载操作符的说明 感谢原作者 一、关于\(priority\_queue\)的说明 内部实现 priority_queue默认情况下,以\(vector\)为底层容器,加上\(heap\)(默认\(max-heap\))处理规则;形成大根堆。 \(priority\_queue\)被归为\(container\)\(adapter\),也就是对\(container\)进行封装一层。 priority_queue操作规则上是\(queue\),只允许在尾部加入元素,并从首部取出元素;只不过内部元素具有优先级,优先级高者先出。 priority_queue的所有元素进出具有一定规则,所以不提供遍历功能,也不提供迭代器。 疑惑产生 下面为priority_queue的使用规则,第一个传入了类型,第二个为容器类型,第三个为比较函数。 template< classT, classContainer=std::vector<T>, classCompare=std::less<typenameContainer

  • 为何经严格测试质量合格的产品,在用户那问题频现 ?

    Hello,各位Tester,晚上好。   今晚不聊具体技术细节,聊聊解决问题的思路 。   此主题,源于今晚老徐的一条朋友圈 。       此条朋友圈发出后,收到上百位同学的赞赏&体验。   接下来的事,很多Tester应该能猜到, 随即朋友圈各种此玩法的刷屏,大家都在尝鲜体验(每次老徐体验新产品后,都会有一批同学好奇去体验,「给赞」是不是考虑给广告费,哈哈哈 )   接下来,老徐这条朋友圈下面,就是各种Bug反馈了(Tester的职业病,看到Bug就会去反馈)。   主要几方面问题。 1.赞赏后,语音播放不了/播放没声音。 2.赞赏后,手贱,退出了,惊喜都没看到是啥。 3.赞赏后,异常退出/闪退了,然后就没有然后了...   总结下来,主要三类问题。 1.很多主流机型的兼容,没覆盖到位。 2.技术方案设计的时候,没考虑通用的实现技术,导致各种兼容问题。 3.异常情况,没充分覆盖。 4.用户体验,用户使用场景的充分考虑。   /  

  • 导致Asp.Net站点重启的10个原因

    Asp.Net站点有时候会莫名其妙的重启,什么原因导致的却不得而知,经过一番折腾后,我总结了导致Asp.Net站点重启的10个原因 1.回收应用程序池会导致站点重启,记录的原因是: HostingEnvironmentinitiatedshutdownHostingEnvironmentcausedshutdown 2.修改应用程序池回收规则会导致重启,记录的重启原因: HostingEnvironmentinitiatedshutdownHostingEnvironmentcausedshutdown 3.在IIS中修改站点的名字,不会导致重启 4.修改站点根目录的配置文件web.config,在配置文件注释中添加几个空格会导致重启,记录的重启原因是: CONFIGchangeHostingEnvironmentinitiatedshutdown 但是修改子目录的web.config文件不一定会导致马上重启 5.修改aspx,master文件不一定会导致重启;但是每修改一次都会导致一次重新编译,重新编译次数达到15次之后会导致站点重启,重启原因是: Recompilationlimi

  • SceneKit下关于修改SCNNode 的Shader展示自定义图形

    由于某些需求,需要在苹果OSx系统下展示一组点云,准备使用苹果官方的三维显示控件来完成这一功能。场景点云作为离散的点, 如果每个点以SCNnode的形式加入场景中,则回造成过大的内存消耗,笔者电脑下,单个场景展示到1w点时内存就崩溃了。所以准备通过 修改单个node的shader属性,实现自定义的形状,这样可以节省内存,还可以同时展示多个场景。查询了苹果的官方api文档,https://developer.apple.com/documentation/scenekit/scnshadable/1523348-shadermodifiers   说实话,的确没怎么看懂,以为看懂了写出来还是不对。搜索了一下傻瓜视频。才实现了基本颜色的功能。 (原本手册是非常管用的,只是不适合我这种英文不太好的菜鸟) SCNProgram  通过使用GLSL(OpenGLShadingLanguage )或者Metalshadinglanguage进行重写。当你希望完全替换SceneKit的原来的变换处理的时候,如果仅仅是简单的修该和替换的话,官方建议使用shaderModi

  • 幽灵的礼物

    小美期货  41人赞同了该回答 《华尔街的幽灵》这本书很早就读过,还有一个译名叫做《幽灵的礼物》。整本书下来,讲了两个规则,幽灵将这两个规则视作给读者的礼物。这两个规则结合在一起,其实就是要将截亏持赢做到极致,不在意胜率,而是追求极致的盈亏比。   我虽然非常认同幽灵的这两个法则背后的操作思路,但是在实际操作中,却也很难坚定执行。在这里对它们做一个解读,供大家参考。   01幽灵的规则一,是关于止损的   平常我们的止损,一般是时间点止损,关键点位止损,能承受的损失止损等。但幽灵的观点更绝对一点,那就是建仓后只要没有被市场证明是正确的,没有获得大幅盈利,就止损。   幽灵对待止损的这个态度,对于绝大多数人来说,是相当震撼的。因为我们习惯性的认为持仓待涨是天经地义?大师让我们顿悟:不要等待出现亏损再减仓、清仓——永远不要等着让市场提醒你已经出错。 夸张吗?一点都不夸张,而且与《短线操作秘诀》里的“大区间日子”有异曲同工之妙。 大区间理论认为,市场上能让人赚到钱的日子并不多,很多时候都是在做无谓的横盘与震荡,只有那些大区间日

  • springboot中导入导出excel文件

      原文:https://www.jianshu.com/p/5d67fb720ece   在开发中会遇到导入Excel文件或者DBF文件等,这里记录如何更简单的在springboot中导入导出Excel文件,不同于用poi,还需要写大段工具类代码 此处运用别人造好的轮子【easypoi】   pom引入 需要的jar包 编写实体类   此处注意必须要有空构造函数,否则会报错“对象创建错误”(我并未考证)   关于注解@Excel,其他还有@ExcelCollection,@ExcelEntity,@ExcelIgnore,@ExcelTarget等,此处我们用不到,可以去官方查看更多 publicclassExcelBean{ @Excel(name="姓名",orderNum="0") privateStringname; @Excel(name="性别",replace={"男_2","女_1"},orderNum="1") privateStringsex; @Excel(name="生日",orderNum="2"

  • 动态规划-01背包问题

    动态规划 基本思想: 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。 与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解) 01背包问题 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C

  • 【CSP模拟赛】starway(玄学建边 最小生成树)

    问題描述   小w伤心的走上了Starwaytoheaven。  到天堂的道路是一个笛卡尔坐标系上一个n×m的长方形通道(顶点在(0,0))和(n,m)),小w从最左边任意一点进入,从右边任意一点走到天堂。  最左最右的距离为n,上下边界距离为m。  其中长方形内有k个Star,每个Star都有一个整点坐标,Star的大小可以忽略不计,  每个Star以及长方形上下两个边缘(宇宙的边界)都有引力,所以为了成功到达heaven小w离他们越远越好。  请问小V走到终点的路径上,距离所有星星以及边界的最小距离最大值可以为多少? 输入格式   一行三个整数n,m,k。  接下来k行,每行两个整数xi,yi表示一个点的坐标。 输出格式    一行一个整数表示答案,绝对误差不能超过10-6。输入样例  1052  11   23输出样例&nb

  • Maven本地上有包还去网上找包

    Maven本地上有包还去网上找包? 场景 内网环境 拿到一个本地库之后,进行编译,提示少包. 从别的地方获取到包之后,放到本地库内后,重新进行编译,却还是少包 在settings内设置了offline为true也没有用,依旧找不到包 日志: [ERROR]Pluginorg.springframework.boot:spring-boot-maven-plugin:1.5.6.RELEASEoroneofitsdependenciescouldnotberesolved:Failedtoreadartifactdescriptorfororg.springframework.boot:spring-boot-maven-plugin:jar:1.5.6.RELEASE:Couldnottransferartifactorg.springframework.boot:spring-boot-maven-plugin:pom:1.5.6.RELEASEfrom/tocentral(http://repo1.maven.org/maven2):repo1.maven.org:Nameor

  • vscode的插件收集

    转:https://zhuanlan.zhihu.com/p/27905838 转:https://segmentfault.com/a/1190000006697219

相关推荐

推荐阅读