python之捕捉异常

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


前言

如果异常未捕捉,系统就会一直将异常传递下去,直到程序由于异常而异常而中断。为了避免出现这种程序异常中断的情况,现在对“危险”的代码段进行异常捕捉。在python语言中,使用try……except语句进行异常捕获。那么这个语句有哪些用法呢?


一、try……except语句的基本用法

try……except语句用于捕获代码块中的异常。在使用try……except语句之前,先看一下不使用该语句的情况。

x = int(input('请输入分子:'))
y = int(input('请输入分母:'))
print('x/y={}'.format(x / y))

执行上面的代码后,分子输入任意的数值,分母输入0,会抛出,会抛出下述所示的异常,从而导致程序奔溃,也就是说,本来正常执行第3条语句(print函数),但由于x/y中的y变量是0,所以直接抛出了异常,因此,第三条语句后面所有的语句都不会被执行。

请输入分子:>? 30
请输入分母:>? 0
Traceback (most recent call last):
  File "D:\ProgramData\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2963, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-2-ece946d564d3>", line 3, in <module>
    print('x/y={}'.format(x / y))
ZeroDivisionError: division by zero

由于用户的输入是不可控的,所以当采集用户输入的数据时,应该使用try……except语句对相关代码进行异常捕捉,尽管异常并不会每次都发生,但这么做可以有备无患。

1、本例通过try……except语句捕捉用户输入可能造成的异常,如果用户输入了异常数据,会提示用户,并要求重新输入数据
x = None
while True:
    try:
        # 如果x已经有了值,表示已经捕捉了异常,那么再次输入数据时,就不需要输入x值了
        if x == None:
            x = int(input('请输出分子:'))
        y = int(input('请输入分母:'))
        print('x/y={}'.format(x / y))
        break
    except:
        print('分母不能为0,请重新输入分母')  # 只有发生异常时,才会执行这行代码

执行上面的代码,分子输入30,分母输入0,按enter键会输出异常提示信息,然后会要求再次输入分母,输入一个非零的数值,如30,按enter键后,会输出x/y的结果。

请输出分子:>? 30
请输入分母:>? 0
分母不能为0,请重新输入分母
请输入分母:>? 30
x/y=1.0

从上面的例子可以了解关于try……except语句的如下几方面内容:

  1. try……except语句是一个代码块,所以try和except后面都要加冒号(:)
  2. try和except之间是正常执行的语句,如果这些代码不发生错误,那么就会正常执行下去,这时except部分的代码时不会执行的。如果try 和except之间的代码发生了错误,那么错误点后面的代码都不会被执行了,而会跳到except子句去执行except代码块中的代码。
  3. 如果except关键字后面没有指定任何异常类,那么except部分可以捕捉任何的异常。

二、捕捉多个异常

我们并不能预估一个代码块到底会不会抛出异常,以及抛出多少中异常。所以需要使用try……except语句捕捉尽可能多的异常,因此,except子句可以包含任意多个。不过程序员并不能准确估计一代码块抛出的异常种类,所以使用具体异常类来捕捉异常,有可能会遗漏某个异常,在这种情况下,当抛出这个当抛出这个被遗漏的异常后,程序还是会崩溃,所以比较保险的做法是最后一个except子句不使用任何异常类,这样就会捕捉其他所有未指定的异常没从而让程序更加健壮。

try:except 异常类1:
	…
except 异常类2:
	…
	…
except 异常类n:
	…
except#捕捉其他未指定的异常
  1. 本例将通过SpecialCale类的三个方法(add、sub、mul)和raise语句抛出两个自定义的异常(NegativeException和ZeroException),div方法可能会派出内建的NegativeException异常。这位三个会通过except子句进行捕捉,最后会使用except语句捕捉其他未指定的异常。本例的很逻辑在while循环中,通过console输入表达式(如add),动态调用SpecialCale类的相应方法,不管是抛出异常还是正常掉调用,都会重新要求输入新的表达式,直到输入“end”命令退出while 循环。
# 自定义异常类,表示操作数或计算结果为负数时抛出异常
class NegativeException(Exception):
    pass


# 自定义异常类,表示操作数为0时抛出的异常
class ZeroException(Exception):
    pass


class SpecialCalc:
    def add(self, x, y):

        # 当x和y有一个小于0时抛出NegativeException异常
        if x < 0 or y < 0:
            raise NegativeException
        return x + y

    def sub(self, x, y):

        # 当x-y的差值是负数时或抛出NegativeException异常
        if x - y < 0:
            raise NegativeException
        return x - y

    def mul(self, x, y):

        # 当x和y至少有一个是0是抛出ZeroException异常
        if x == 0 or y == 0:
            raise ZeroException
        return x * y

    def div(self, x, y):
        return x / y


while True:
    try:
        # 创建SpecialCalc实例
        calc = SpecialCalc()
        # 从console输入表达式
        expr = input("请输入要计算的表达式,例如add(1,2):")
        if expr == 'exit':
            break
        # 使用eval函数动态执行输入的表达式,前面需要加上‘calc.’前缀
        # 因为这些方法都属于SpecialCalc类
        result = eval('calc.' + expr)
        # 在控制台输出结果,保留小数点后两位
        print('计算结果:{:.2f}'.format(result))
    except NegativeException:
        print('********负数异常******')
    except ZeroException:
        print('******操作数为0异常****')
    except ZeroDivisionError:
        print('******分母不能为0******')
    except:
        print('****其他异常**********')

运行上面的程序,并输入不同的表达式来引发两个定制的异常和ZeroDivsionError,以及输入错误的表达式以便引发其他异常,运行结果如下:

请输入要计算的表达式,例如add(1,2):add(1,3)
计算结果:4.00
请输入要计算的表达式,例如add(1,2):add(-5,3)
********负数异常******
请输入要计算的表达式,例如add(1,2):sub(4,6)
********负数异常******
请输入要计算的表达式,例如add(1,2):div(40,0)
******分母不能为0******
请输入要计算的表达式,例如add(1,2):div(53,21)
计算结果:2.52
请输入要计算的表达式,例如add(1,2):abvcd
****其他异常**********
请输入要计算的表达式,例如add(1,2):exit

Process finished with exit code 0

插曲:在调试上面的代码的时候由于自己的粗心,中间一个标点符号打错了,然后持续运行之后出现这样的情况。

请输入要计算的表达式,例如add(1,2):add(1,2)
****其他异常**********
请输入要计算的表达式,例如add(1,2):sub(4,2)
****其他异常**********
请输入要计算的表达式,例如add(1,2):div(5,2)
****其他异常**********
请输入要计算的表达式,例如add(1,2):exit

Process finished with exit code 0

直到我祛除了最后一行捕捉其他异常的错误信息之后再次进行调试,才发现了问题在哪。

请输入要计算的表达式,例如add(1,2):add(1,3)
Traceback (most recent call last):
  File "D:/pyproject/leetcode/editor/LeetCode学习.py", line 66, in <module>
    print('计算结果:{:.2f}'.format(result))
KeyError: ':'

Process finished with exit code 1

从上面的错误信息中能够看到错误的代码以及代码所在的行数等,是我在格式化输出的时候没有冒号错误使用了中文的冒号。所以,在捕捉异常的时候,如果代码出现了其他异常,注释掉最后一个捕捉所有异常的代码,再次运行也许是一个不错的选择。


三、用同一个代码块处理多个异常

虽然代码块可能抛出多个异常牡丹石有时多个异常的处理程序可以是一个,在这种情况下,如果用多个except子句捕捉这些异常,就需要在每一个except子句中使用同一段代码处理这些异常。为了解决这个问题,except子句允许指定多个异常,这样指定后,同一个except子句就可以捕捉多个异常了。

try:
	……
except(异常1,异常2,异常3,……异常n)
  1. 本例定义了一个raiseException函数,用于随机抛出三个自定义异常,然后用同一个except子句捕捉异常。
# 第一个自定义异常类
class CustomException1(Exception):
    pass


# 第二个自定义异常类
class CustomException2(Exception):
    pass


# 第二个自定义异常类
class CustomException3(Exception):
    pass
#导入random模块
import random
#随机抛出前三个自定义异常
def raiseExecption():
    n=random.randint(1,3)
    print('抛出CustomException{}异常'.format(n))
    if n==1:
        raise CustomException1
    elif n==2:
        raise CustomException2
    else:
        raise CustomException3

try:
    raiseExecption()
#使用except子句同时捕捉这三个异常
except(CustomException1,CustomException2,CustomException3):
    print('*****执行异常处理结果******')

运行结果如下:

第一次运行结果:
抛出CustomException2异常
*****执行异常处理结果******

第二次运行结果:
抛出CustomException3异常
*****执行异常处理结果******



总结

以上就是本文要介绍大的主要内容,在前面一篇文章中主要介绍了什么是异常,如何创建异常类以及如何主动抛出异常,本文则重点介绍如何捕捉异常,try……except语句的基本用法、以及如何捕捉多个异常等文章来源地址https://www.toymoban.com/news/detail-564640.html

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

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

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

相关文章

  • 【Python机器学习】零基础掌握StackingRegressor集成学习

    如何更准确地预测糖尿病患者的血糖水平? 糖尿病是一种影响全球数百万人的慢性疾病。有效地管理和预测血糖水平是糖尿病患者日常生活的重要一环。单一的预测模型(比如线性回归、支持向量机等)虽然有一定的效果,但在处理复杂的医疗数据时,其准确性可能会受到限

    2024年02月08日
    浏览(41)
  • 【Python机器学习】零基础掌握AdaBoostRegressor集成学习

    有没有经历过这样的状况:需要预测未来房价走势,但传统的预测方法并不总是准确? 房价预测一直是人们关注的热点话题,无论是房产商、购房者,还是政府,都需要准确地知道未来房价的走势。那么,有没有一种更加精准、稳定的预测方法呢?答案是有的——AdaBoost Re

    2024年02月06日
    浏览(33)
  • 【Python机器学习】零基础掌握BaggingRegressor集成学习

    如何提升回归模型的稳定性和准确性? 在实际生活中,比如房价预测,经常会遇到一种情况:有大量的特征和样本数据,但模型的预测准确度仍然不尽人意。这时候,单一的模型(如支持向量机回归)可能表现得并不够好。 考虑到这个问题,解决方案可能是使用集成方法,

    2024年02月05日
    浏览(32)
  • 机器学习Python7天入门计划--第一天-机器学习基础-讲人话

    机器学习Python7天入门计划 - 第一天: 机器学习基础 学习目标: 理解机器学习的基本概念和过程。 掌握基本的数据预处理技巧。 理解线性回归的原理和应用。 学习内容: 机器学习基础 什么是机器学习:机器学习是一种使计算机能够从数据中学习规律和模式的技术。 为什么

    2024年01月20日
    浏览(50)
  • 【零基础学机器学习 2】 机器学习的实操步骤-以及在Python中实现机器学习模型

    👨‍💻 作者简介:程序员半夏 , 一名全栈程序员,擅长使用各种编程语言和框架,如JavaScript、React、Node.js、Java、Python、Django、MySQL等.专注于大前端与后端的硬核干货分享,同时是一个随缘更新的UP主. 你可以在各个平台找到我! 🏆 本文收录于专栏: 零基础学机器学习 🔥 专栏

    2024年02月05日
    浏览(43)
  • 【Python机器学习】零基础掌握IsotonicRegression等渗回归

    想要预测一个事件的结果,但因素多且复杂,难以得出精确的预测?在金融、医疗、教育等多个领域,这样的问题是非常普遍的。 假设在医疗领域,医生需要根据多项指标(如年龄、血压、胆固醇水平等)来预测患者是否有心脏病的风险。因为每个指标对结果的影响都可能不

    2024年02月07日
    浏览(35)
  • 【Python机器学习】零基础掌握SimpleImputer缺失值填充

    如何处理数据集中的缺失值,以便更准确地进行数据分析或模型训练? 在数据分析和机器学习中,数据的完整性和准确性至关重要。但现实情况是,收集到的数据往往存在缺失值。例如,医疗研究中可能缺少某些患者的体重、年龄或血压等信息。这样的缺失值会对数据分析或

    2024年02月08日
    浏览(31)
  • 【Python机器学习】零基础掌握BayesianRidge贝叶斯回归

    如何准确预测房价? 在现实生活中,购买房产可能是最大的一笔投资。因此,准确预测房价变得尤为重要。通常,房价受到多个因素的影响,包括地段、房龄、房屋面积等。但如何综合这些因素来做出准确预测呢? 这里介绍一种机器学习算法:贝叶斯岭回归(Bayesian Ridge R

    2024年02月08日
    浏览(37)
  • Python机器学习项目开发实战:如何预测建模

    注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python机器学习项目开发实战_预测建模_编程案例解析实例详解课程教程.pdf 在Python中进行机器学习项目开发实战,预测建模是一个常见的应用场

    2024年04月22日
    浏览(35)
  • 速看,关于Python的17个学习网站,从基础到机器学习【建议收藏】

    https://docs.python.org/zh-cn/3.9/index.html 这个是Python各个版本的官方文档,支持下载到本地阅读,可以当做学习手册,在遇到问题的时候查找使用。推荐学习内容: 入门教程 标准库参考 分发Python模块 https://www.python.org/downloads/ 这个网站包含Python不同系统【windows、linux、macOS、other】

    2024年02月19日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包