Python 允许程序自行引发异常,自行引发异常使用 raise 语句来完成。

1.引发异常
raise 语句有如下三种常用的用法 :

  1. raise: 单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except块中),或默认引发 RuntimeError 异常 。
  2. raise 异常类: raise 后带一个异常类。该语句引发指定异常类的默认实例。
  3. raise 异常对象:引发指定的异常对象。

​ raise语句每次只能引发一个异常实例。

下面示范用户引发异常的两种方式:

def main():try:# 使用try...except来捕获异常# 此时即使程序出现异常,也不会传播给main函数mtd(3)except Exception as e:print('程序出现异常: ', e)# 不适用try...except来捕获异常mtd(3)def mtd(a):if a > 0:raise ValueError('a的值大于0, 不符合要求')main()

​ 上面第一行输出是第一次调用 mtd(3)的结果,该方法引发的异常被except 块捕获并处理。后面的一段输出的是第二次调用 mtd(3) 的结果,由于该异常没有被 except 块捕获,因此该异常一向上传播给 Python 解释器导致程序中止。

2.自定义异常类
很多时候程序可以选择引发自定义异常,因为异常的类名通常也包含了该异常的有用信息。所以在引发异常时,应该选择合适的异常类,从而可以明确的描述该异常情况。在这种情形下应用程序常常需要引发自定义异常。
用户自定义异常 应该继承 Exception 基类或Exception的子类,在字定义异常类时基本不需要书写更多的代码,只要指定自定义异常类的父类即可。

class AuctionException(Exception): pass

​ 上面程序创建了AuctionException异常类,该异常类不需要类体定义,因此使用 pass 语句作为占位符即可。

3.except和raise同时使用
当一个异常出现时,单靠某个方法无法完全处理该异常,必须由几个方法协作才可完全处理该异常。也就是说,在异常出现的当前方法中, 程序只对异常进行部分处理,还有些处理需要在该方法的调用者中才能完成,所以应该再次引发异常,让该方法的调用者也能捕获到异常。
为了实现这种通过多个方法协作处理同一个异常的情形,可以在 except 块中结合 raise 语句来 完成。

class AuctionException(Exception): passclass AuctionTest:def __init__(self, init_price):self.init_price = init_pricedef bid(self, bid_price):d = 0.0try:d = float(bid_price)except Exception as e:print('转换出异常', e)# 再次引发自定义异常raise AuctionException('竞拍价必须是数值,不能包含其他字符')if self.init_price > d:raise AuctionException('竞拍价比起拍价低,不允许竞拍')initPrice = ddef main():at = AuctionTest(20.4)try:at.bid('df')except AuctionException as ae:# 再次捕获到bid()方法中的异常,并对该异常进行处理print('main函数捕获的异常', ae)main()

​ except 块捕获到异常后,系统打印了该异常的字符串信息,接着引发一个 AuctionException 异常,通知该方法的调用者再次处理该 AuctionException 异常。所以 程序中的 main() 函数,也就是 bid()方法的调用者还可以再次捕获 AuctionException 异常,井将该异 常的详细描述信息打印出来。
​ 实际应用对异常的处理通常分成 两个部分:①应用后台需要通过日志来记录异常发生的详细情况;②应用还需要根据异常向应用使用者传达某种提示。在这种情形下,所有异常都需要两个方法共同完成,也就必须将 except和raise 结合使用。
​ 如果程序需要将原始异常的详细信息直接传播出去,Python 也允许用自定义异常对原始异常进行包装,只要将上面except块内的raise语句改为:

raise AuctionException(e)

​ 上面就是把原始异常e包装成了AuctionException 异常,这种方式也被称为异常包装或异常转译。

4.raise不需要参数
在使用 raise 语句时可以不带参数,此时 raise 语句处于 except 块中,它将会自动引发当前上下文激活的异常,否则,通常默认引发 RuntimeError 异常。

class AuctionException(Exception): passclass AuctionTest:def __init__(self, init_price):self.init_price = init_pricedef bid(self, bid_price):d = 0.0try:d = float(bid_price)except Exception as e:print('转换出异常', e)# 再次引发自定义异常raiseif self.init_price > d:raise AuctionException('竞拍价比起拍价低,不允许竞拍')initPrice = ddef main():at = AuctionTest(20.4)try:at.bid('df')except Exception as ae:# 再次捕获到bid()方法中的异常,并对该异常进行处理print('main函数捕获的异常', ae)main()

Python笔记----使用raise引发异常相关推荐

  1. Python——raise引发异常

    Python--raise引发异常 参考文章: (1)Python--raise引发异常 (2)https://www.cnblogs.com/mingmingming/p/11254596.html ...

  2. python raise valueerror_Python——raise引发异常

    程序出现错误,会自动引发异常,Python也允许使用raise语句自行引发异常. 一.使用raise引发异常 单独一个raise引发异常,默认引发RuntimeError异常,例: try: prin ...

  3. devi into python 笔记(五)异常 文件操作 sys os glob模块简单实用

    异常: Java异常: try catch块处理异常,throw引发异常. Python异常: try except块处理异常,raise引发异常. 异常如果不主动处理,则会交给Python中的缺省处 ...

  4. python中能主动引发异常的是_python--异常处理-主动引发异常-自定义异常类

    一.主动引发异常 并非只有在程序运行出错时才可以引发异常,python允许在代码中使用raise或assert语句主动引发异常. 1.raise语句 1.1基本格式: raise 异常类名 #创建异常 ...

  5. 【PYTHON 笔记】:捕捉异常

    目录 1.python中的异常 2.捕捉异常 try-except 多个except子句 一个except块捕捉多个异常 空except:捕捉所有异常 as语句: else语句: finally子句 ...

  6. python——异常except语句用法与引发异常 (摘抄)

    原文地址:https://www.cnblogs.com/Simon-xm/p/4073028.html except: #捕获所有异常 except: <异常名>: #捕获指定异常 ex ...

  7. python 使用异常函数_您如何测试Python函数引发异常?

    python 使用异常函数 This article elaborates on how to implement a test case for a function that raises an ...

  8. Python基础学习笔记(十三)异常

    参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-exceptions.html Python用异常对象(excep ...

  9. python 参数解析器_Python参数解析器,在h之前引发异常

    我不知道为什么会这样.我的理解是用户至少有机会在执行默认操作之前使用-h.import os, sys, argparse class argument_parser(): # call on all ...

最新文章

  1. python3 返回当前星期几 中文
  2. Java基础-static 关键字解析
  3. 用jquery实现html5的placeholder功能
  4. .net core ——利用 roslyn 编译C#代码
  5. 作者:张思思(1985-),女,博士,中国科学院北京基因组研究所生命与健康大数据中心工程师...
  6. 光电整纬机常见操作问题
  7. erlang之三种socket消息循环
  8. java分析dump文件_干货分享丨jvm系列:dump文件深度分析
  9. java speex回声消除_Speex回声消除原理深度解析
  10. 《数学之美》知识点详细总结
  11. python 输出sql汉字_emai中的pythonsql输出
  12. 波特率、比特率 与数据传输速率的区别
  13. project web architecture
  14. WPF开发经验-实现Win10虚拟触摸键盘
  15. DDD领域驱动设计-分层架构实践
  16. 关于移动端的touch事件(touchstart, touchmove, touchend,touchcancel)
  17. 变身成为互联网设计师
  18. [机缘参悟-28]:鬼谷子-内揵篇-保全自己,说服上司
  19. Consider defining a bean of type `xxx` in your configuration问题解决
  20. 深度盘点:一文详解数据分析中100个常用指标和术语

热门文章

  1. symfony老版本自主学习
  2. 计算机科学类学术论文,计算机科学与技术学院申请博士学位发表学术论文的规定(2008.9上网)...
  3. 软件工程不会教不懂编程的人如何编程
  4. 和程序员约会的十个理由
  5. 2013年10月高等教育考试电子商务与电子政务试题
  6. 2022-2028全球与中国磁屏蔽功率电感器市场现状及未来发展趋势
  7. 聚划算成清仓专用 问题产品充斥
  8. Qt编写地图综合应用19-地图服务
  9. 金山快盘API二次开发 - OAUTH协议
  10. 微信公众号第三方平台开发笔记--02获取component_verify_ticket