第07章:python自动化——异常处理

目录

一、try...except语法应用

二、Exception对象

三、else与finally语法应用

四、raise关键字

五、Traceback模块应用


一、try...except语法应用

在常规程序运行的时候,代码会出现有报错的可能。程序报错是避免不了的。在python中,程序一旦出错,程序就会终止运行。会将错误信息显示在控制台之中,包括出现什么错误,在哪个文件,在哪一行等相关内容。很多时候我们希望即便遇到错误,也能够正常运行程序。

程序出现异常,一般分为两种:

  • Error(错误):一般来说常见于语法的错误、运算逻辑错误时、断言错误时会出现Error,通过控制台输出的信息可以明确知道error的类型。除去一般在编写时的错误以外,也还是会存有运行时的错误。比如下图是一个erro报错,除数不能为零

  • Exception(异常):是我们程序运行期间,可能因为数据的流转以及获取等情况下,会检测到的错误。各种各样的erro的集合就是Exception。

不论是错误还是异常,其实最根本的是需要在出现这些问题的时候通过一些手段,将容易出现错误或者异常的代码块进行错误的监测,确保在出现错误或者异常的时候程序能够正常去处理这些可能存在的情况。在python中应用的手段就是try...except语法

try...except是对可能出现的错误进行处理,而不是对百分百会出错的问题进行处理。如果代码百分百会出错,那就是代码的逻辑是有问题的。下图就是它通过try...except的方法,将除数可能为0的错误给处理了,输入任何数字,都不会报错。

二、Exception对象

在python中,所有的异常都是基于Exception基础类来定义的。
在进行except异常处理的时候,可以用except对Exception进行捕获。所有的报错类型,都是基于Exception类的子类,不管是error还是exception,都是属于子类。
python中有非常多异常的子类,不需要额外去记,如果想要完整捕获所有的不同类型的异常,则直接通过except Exception来处理异常即可。

while True:
    i = int(input())
    if i == 100:
        break
    try:
        c = 20 / i
        print(c)
    except Exception as e:       #这里的Exception包含了所有的异常类
        print('请输入非0以外的正常数字,谢谢。')
        print(e)

三、else与finally语法应用

else用于完整整个代码块的关键字,可以用也可以不用,基于代码逻辑和结构来进行合理的选择使用即可。作用就是在try运行后,如果不报错则进入else中(看最后两行)。如果报错则进入except中

        while True:
            try:  # try之中,将可能出现问题的代码进行编写
                i = int(input())
                if i == 100:
                    break
                c = 20 / i
            except ZeroDivisionError as z:  # except就是将对出现的问题进行解决的措施进行编写。
                print('你输入的数据不能为0,请重新输入,谢谢')
                print(z)
            except ValueError as v:
                print(v)
                print('请输入数字,谢谢')
            except Exception as e:
                print('请输入非0以外的正常数字,谢谢。')
                print(e)
            else:  # 写不写无所谓,因为else中的内容在个人看来只是为了确保代码的完整性。
                print(c)

finally是非常有用的关键字(看最后两行)。在整个try...except语法结构中,如果涉及到资源的利用,包括但不限于文件的操作等,一定记得在最终要添加finally,用于做资源的释放处理。在程序的世界里,资源的释放非常重要。

while True:
            try:  # try之中,将可能出现问题的代码进行编写
                i = int(input())
                if i == 100:
                    break
                c = 20 / i
            except ZeroDivisionError as z:  # except就是将对出现的问题进行解决的措施进行编写。
                print('你输入的数据不能为0,请重新输入,谢谢')
                print(z)
            except ValueError as v:
                print(v)
                print('请输入数字,谢谢')
            except Exception as e:
                print('请输入非0以外的正常数字,谢谢。')
                print(e)
            else:  # 写不写无所谓,因为else中的内容在个人看来只是为了确保代码的完整性。
                print(c)
            finally:  # 整个try体系中,最终不管结果如何都一定会执行的代码。一般是用于收尾的工作,将不必要的内容全部释放
                print('这是finally语法块里的内容,不管逻辑如何,最终一定会执行的代码。主要用于最后的收尾工作。')

四、raise关键字

程序会出现异常,这是必然现象。当出现异常的时候,程序的第一反应是抛出异常。既然程序可以抛出异常,那我们也可以抛出异常。当出现异常的时候,第一种处理手段是通过try...except来进行异常的处理,另一种手段就是把异常继续抛出。

异常分为两种:

  1. 程序运行时,因为本身程序的设定而有的异常,就是我们所称呼的Exception对象。

  2. 因为程序运行的业务逻辑,而产生的不符合需要的情况,称之为自定义异常。(程序没错,知识结果不符合需求)

# 程序设计需求:需要通过用户传入小于10的数字,来执行除数为10以内的任意数值的除法计算
        while True:
            try:  # try之中,将可能出现问题的代码进行编写
                i = int(input())
                if i <= 10:
                    raise       # raise的作用就是抛出一个异常。不再考虑触发机制,而是代码只要运行到raise就抛出异常。这里就是自定义的异常
                if i == 100:
                    break
                c = 20 / i
            except Exception as e:  # except就是将对出现的问题进行解决的措施进行编写。
                print('请输入非0以外的正常数字,谢谢')

 下图为输入的i的值<=10的时候,定义了一个抛出异常,当输入的值小于10的时候,就会抛出异常进行提醒。如果输入>10的数字,是符合需求的,就不会抛出异常。

 下面是用户自定义异常,需要先用class类定义自定义异常,并且继承Exception类

# 定义一个自定义异常类,选择继承于Exception类即可。
class HzpException(Exception):
    pass



while True:
            try:  # try之中,将可能出现问题的代码进行编写
                i = int(input())
                if i <= 10:
                    raise  HzpException     # raise的作用就是抛出一个异常。不再考虑触发机制,而是代码只要运行到raise就抛出异常。这里就是自定义的异常
                if i == 100:
                    break
                c = 20 / i
            except Exception as e:  # except就是将对出现的问题进行解决的措施进行编写。
                print('请输入非0以外的正常数字,谢谢')

 如果想要添加异常的文字信息,可以调用__str__函数来实现文字的内容定义。


# 自定义异常类的基本使用
class MyException(Exception):
    # 构造函数
    def __init__(self):
        # 这是构造函数
        pass

    # 定义异常的文字信息:要返回异常的信息内容,记得用return
    def __str__(self):
        return '这里是异常的文字信息'


while True:
    try:  # try之中,将可能出现问题的代码进行编写
        i = int(input())
        if i>10:
            raise MyException
        if i == 100:
            break
        c = 20 / i
    except Exception as e:  # except就是将对出现的问题进行解决的措施进行编写。
        print(e)

五、Traceback模块应用

虽然Exception类可以捕获所有的异常信息,但是,捕获之后我们没有办法很好地追踪这些异常,如果出现意料以外的异常,我们也没有很好办法去进行追踪定位,以及修改的手段。

在python中,所有的异常都是基于traceback模块来进行追踪定位和返回异常信息的。如果想要通过try语法块对异常进行处理,同时又想要看到更多异常信息,通过print实现不了,需要调用traceback来进行内容的打印,会更加清晰。

traceback库是官方自带的库,用import traceback的方式导入

红色框框就是traceback的作用,将异常详细信息显示出来,并且代码还可以继续执行。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值