Python——异常处理

这篇具有很好参考价值的文章主要介绍了Python——异常处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

异常

  • 异常是在程序执行过程中发生的影响程序正常执行的一个事件。
  • 异常是Python对象,当Python无法正常处理程序时就会抛出一个异常。一旦Python脚本发生异常,程序需要捕获并处理它,否则程序会终止执行。
  • 异常处理使程序能够处理完异常后继续它的正常执行,不至于使程序因异常导致退出或崩溃。
while True:
    try:
        price=float(input("请输入价格:"))
        print('价格为:%5.2f' % price)
        break
    except ValueError:
        print('您输入的不是数字。')
程序运行结果:
请输入价格:x
您输入的不是数字。
请输入价格:y
您输入的不是数字。
请输入价格:12.989
价格为:12.99
  • 上述程序运行时,当在提示符下输入非数字时,float()函数将产生一个ValueError异常。try块中检测到ValueError异常后,终止try中后续代码的执行,转而执行异常处理代码,也就是执行except ValueError语句后面的代码。处理完异常后,继续从while语句的开始部分执行。只要输入的是非数字,float()函数都将产生ValueError异常,break语句不会执行,循环一直继续,程序反复要求用户输入正确的数字。
  • 直到用户输入正确的数字后,float()函数不会抛出ValueError异常,try模块中的代码继续往下执行,直到执行break语句后,退出while循环。

Python中的异常类

  • Python程序出现异常时将抛出一个异常类的对象。
  • Python中所有异常类的根类是BaseException类,它们都是BaseException的直接或间接子类。大部分常规异常类的基类是Exception的子类。
  • 不管程序是否正常退出,都将引发SystemExit异常。例如,在代码中的某个位置调用了sys.exit()函数时,将触发SystemExit异常。利用这个异常,可以阻止程序退出或让用户确认是否真的需要退出程序。
  • KeyboardInterrupt异常是因用户按下Ctrl+C组合键来终止命令行程序而触发。

捕获与处理异常

  • try/except语句用来检测try语句块中的异常,让except语句捕获异常信息并处理。如果不想在异常发生时结束程序,只需要在try里捕获它,并在except中处理捕获到的异常。
try:
    <可能出现异常的语句块> 
except <异常类名字name1>:
    <异常处理语句块1>  #如果在try部份引发了'name1'异常,执行这部分语句块
except <异常类名字name2> as e1:
    <异常处理语句块2>  #如果在try部份引发了'name2'异常,执行这部分语句块
except < (异常类名字name3, 异常类名字name4, …)> as e2:
    <异常处理语句块3>  #如果引发了'name3'、'name4'、…中任何一个异常,执行该语句块
…
except:
    <异常处理语句块n>   #如果引发了异常,但与上述异常都不匹配,执行此语句块
else:
    <else语句块>         #如果没有上述所列的异常发生,执行else语句块
finally:
    <任何情况下都要执行的语句块>
  • try中的语句块先执行。如果try语句块中的某一语句执行时发生异常,Python就跳到except部分,从上到下判断抛出的异常对象是否与except后面的异常类相匹配,并执行第一个匹配该异常的except后面的语句块,异常处理完毕。
  • 如果异常发生了,但是没有找到匹配的异常类别,则执行不带任何匹配类型的except语句后面的语句块,异常处理完毕。
  • 如果try语句块的某一语句里发生了异常,却没有匹配的except子句,也没有不带匹配类型的except部分,则异常将往上被递交到上一层的try/except语句进行异常处理,或者直到将异常传递给程序的最上层,从而结束程序。
  • 如果try语句块中的任何语句在执行时没有发生异常,Python将执行else语句后的语句块。
  • 执行完except后的异常处理语句或else后面的语句块后,程序一定会执行finally后面的语句块。这里的语句块主要用来进行收尾操作,无论是否出现异常都将被执行。
  • 一个异常处理模块至少有一个try和一个except语句块,else和finally语句块是可选的。
try:
   x=float(input('请输入设备成本:'))
   y=int(input('请输入分摊年数:'))
   z=x/y
   print('每年分摊金额为%.2f'% z)
except ZeroDivisionError:
   print("发生异常,分摊年数不能为0.")
except:
   print('输入有误')
else:
   print("没有错误或异常")
finally:
   print('不管是否有异常发生,始终执行finally部分的语句')
如果在终端以正确的格式输入,则except后面的模块均不会执行,else后的模块会得到执行,finally后面的模块语句会执行。程序运行结果如下:
请输入设备成本:15
请输入分摊年数:3
每年分摊金额为5.00
没有错误或异常
不管是否有异常发生,始终执行finally部分的语句
如果在终端输入的被除数为0,则会检测到ZeroDivisionError异常对象,在except ZeroDivisionError之后的模块会得到执行来处理该异常。异常处理完成后,执行finally后面的语句块。程序运行结果如下:
请输入设备成本:15
请输入分摊年数:0
发生异常,分摊年数不能为0.
不管是否有异常发生,始终执行finally部分的语句
如果在终端只输入除数,没有输入被除数,try模块中将抛出TypeError异常。在程序的异常处理except中没有列出该类型异常的处理程序模块,但是TypeError是except的子类,因此不带异常类型的except模块能够拦截该异常进行处理。异常处理结束后,finally后面的语句也会得到执行。程序运行结果如下:
请输入设备成本:15
请输入分摊年数:
输入有误
不管是否有异常发生,始终执行finally部分的语句

自定义异常类

  • 异常处理流程一般包括三个步骤:
    • 将可能产生异常的代码段放在try代码块中;
    • 出现特定情况时抛出(raise)异常;
    • 在except部分捕获并处理异常。
  • 笔记前面部分案例使用的标准模块中的异常都是由系统自动抛出,隐藏了异常抛出的步骤。
  • 仅仅使用标准模块中的异常类通常不能满足系统开发的需要,有时候需要自定义一些异常类。系统无法识别自定义的异常类,只能在程序中显式地使用raise抛出异常。可以通过BaseException类或其子类来创建自定义异常类。
  • 如下程序清单给出了一个自定义类InvalidNumberError,该类继承自类ArithmeticError。
    Python——异常处理
    Python——异常处理
  • 因为InvalidNumberError是一个自定义类,因此需要使用raise来显式地抛出异常。自定义异常的其他使用方法与标准模块中的异常类使用方法相同。

with语句

  • with语句是其中一个隐藏低层次抽象的方法。目的是简化类似于try-except-finally这样的代码。
  • try-except-finally通常用于保证资源的唯一分配,并在任务结束时释放资源,如线程资源、文件、数据库连接等。在这些场合下使用with语句将使代码更加简洁。with语句的语法如下:
with context-expression [as var]:
		with语句块

为了读取、打印该文件中的所有内容,并确保程序在出现异常时也能正确关闭文件对象,使用try-finally的程序:

try:
    f=open('testwith.txt','r')
    for line in f:
        print(line,end='')
finally:
    f.close()
  • 使用try-finally语句来确保当try语句块中出现异常时,f.close()语句能够得到执行。如果采用with语句,程序结构将得到进一步的简化。
with open('testwith.txt','r') as f:
    for line in f:
        print(line,end='')

由于使用了with语句,不需要try-finally语句来确保文件对象的关闭。无论该程序是否出现异常,文件对象都将由系统自动关闭。

  • 并不是所有的对象都支持with语句这一新的特性。只有支持上下文管理协议的对象才能使用with语句。
  • 第一批支持该协议的对象有:file、decimal.Context、thread.LockType、threading.Lock、threading.RLock、threading.Condition、threading.Semaphore、threading.BoundedSemaphore。

断言

断言从Python1.5版本开始引入,是申明表达式为真的判定。如果表达式为假则抛出异常。断言语句可以理解为raise-if-not语句,用来测试表达式,如果表达式为假,则触发AssertionError异常;如果表达式为真,也就是断言成功,则程序不采取任何措施。断言的语法格式如下:
assert expression [, arguments]
其中expression是断言表达式;arguments是断言表达式为假时传递给AssertionError对象的字符串。

  • 以下两个例子演示了assert语句后面表达式分别为真与假时的运行结果。
    Python——异常处理
    和其他异常一样,AssertionError也可以通过try-except来捕获。如果没有捕获,该异常将终止程序的运行。
  • 下面程序演示了利用try-except捕获AssertionError异常的方法。

Python——异常处理文章来源地址https://www.toymoban.com/news/detail-444713.html

到了这里,关于Python——异常处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ARMv8-AArch64 的异常处理模型详解之异常等级、执行状态以及安全状态

    在了解AArch64异常等级模型之前,有必要先理解特权的概念。现代软件被开发成不同的模块,每个模块对系统和处理器资源有不同的访问级别。比如操作系统内核和用户应用程序的划分。操作系统内核需要高级别的权限来访问系统资源,然而应用程序应当被限制其配置系统的能

    2024年02月03日
    浏览(40)
  • postgresSQL Extended Query执行过程和sharding-proxy的处理

    PostgreSQL: Documentation: 15: 55.2. Message Flow 多个阶段,可复用 Parse → DESCRIBE statement → SYNC Parse 解析, 将 sql 文本字符串,解析成 named preparedStatement 语句(生命周期随session) 占位符和参数类型 Describe 获取元数据,返回 pst 参数描述符 parameterDescription 和 结果集的行描述符 RowDes

    2023年04月10日
    浏览(18)
  • mysql connector 执行 select 和 shardingshpere-proxy 的处理过程

    use java mysql connector 按照直觉, 既然用了 preparedStatement, 执行过一次后会在服务端缓存好预编译的语句, 之后就能省去这个解析过程,直接提交参数执行就好了 但是, mysql connector 默认创建的是 ClientPreparedStatement 因为默认并没有设置 useServerPrepStmts = true, 默认是false 去指定要

    2023年04月18日
    浏览(34)
  • C语言——可执行程序过程

    我们在编写代码的时候,不知道大家是否和一开始的我一样,在运行代码的时候就直接CTRL+F5运行了呢??一开始,我只知道会生成一个.exe的可执行文件,中间的原理我一点也不知道。 今天就由我带领大家对生成可执行的文件有更深的一层理解。  程序的翻译环境和执行环境

    2024年02月13日
    浏览(38)
  • win7 sp1安装.net Framework 4.6.2未成功:“已处理证书链,但是在不受信任提供程序信任的根证书中终止”

    但提示 安装未成功 :“已处理证书链,但是在不受信任提供程序信任的根证书中终止”。  原因:计算机中没有相应的受信任证书,通过导入微软的证书,成功解决此问题。 解决步骤如下: 微软证书下载地址: http://download.microsoft.com/download/2/4/8/248D8A62-FCCD-475C-85E7-6ED59520FC

    2024年02月05日
    浏览(111)
  • .net Assembly.Load重复加载程序集造成执行异常

    最近ET做热更重载dll的时候,返回登陆会重新检测新的dll,首次登录之前已经Assembly.Load()过一次dll,第二次返回登陆再次load dll到内存中,Invoke执行方法的时候,异常了,有些方法执行了,有些未执行,于是查资料,看到些老资料说Assembly.Load重复加载同名dll不会有问题,而却现

    2024年02月07日
    浏览(62)
  • “已成功与服务器建立连接,但是在登录过程中发生错误“的解决方法

    对于上述问题,我也曾被折磨得不轻。 网上找了很多方法,很多就是每个屁用! 别轻易就重新注册一个新的,否则后面可能还需要花时间去把它删了。 首先,我们会看到连接成功但是登陆不上的报错图。  电脑不同,可能也会有所不同。但大致内容就是上述那样。 方法一:

    2024年02月06日
    浏览(131)
  • 微信小程序的生命周期函数有哪些,以及执行过程?

    目录 1、应用的生命周期  2、页面的生命周期 3、组件的生命周期  4、执行顺序  小程序中,生命周期主要分成了三部分: ① 应用的生命周期        ② 页面的生命周期        ③ 组件的生命周期 1、应用的生命周期  在 app.js 里面调用,通过 App(Object) 函数用来注册一个小

    2024年02月08日
    浏览(52)
  • SQL Server(解决问题)已成功与服务器建立连接,但是在登录过程中发生错误

    SQL Server(解决问题)已成功与服务器建立连接,但是在登录过程中发生错误。provider: Shared Memory Provider, error:0 - 管道的另一端上无任何进程。我们将 身份验证 选择为 SQL Server 身份验证。输入刚刚创建的用户名和密码: 但是现在还是不能直接使用,因为权限问题。你会看到下

    2024年02月06日
    浏览(47)
  • Javascript程序异常处理

    什么是异常,异常就是我们在编写Javascript程序时出现的一些错误,并会在控制台中抛出这个错误,出现异常其实并不是一件坏事,相对的呢它可以提醒我们开发人员哪里出现了错误,方便我们后续的修改,能让我们的代码更加的流畅丝滑的运行,如果你对程序异常还不了解,

    2024年02月15日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包