Python中的异常处理详解,没有比这个更全的了。

一、异常处理的必要性和意义

分析下面程序

def division():
    '''功能:分苹果'''
    print("\n===================== 分苹果了 =====================\n")
    apple = int(input("请输入苹果的个数:"))        # 输入苹果的个数
    children = int(input("请输入来了几个同事:")) 
    result = apple//children                        # 计算每人分几个苹果
    remain =apple-result*children                   # 计算余下几个苹果
    if remain>0:
        print(apple,"个苹果,平均分给",children,"个同事,每人分",result,
              "个,剩下",remain,"个。")
    else:
        print(apple,"个苹果,平均分给",children,"个同事,每人分",result,"个。")
division()

当输入同事的个数为0时:

 这是个典型的除零错误。Python给出了一个标准的ZeroDivisionError.

可是这是一个下策。虽然给出了异常提示,但是程序已经被迫中断了,如果这段程序是蕴含在其他的大型程序中,那么由于这个小失误,让整个程序崩溃退出,是不合适的。因此,Python给出了异常处理的机制,旨在让程序在出错时,预判到错误,并给出合理的“软着陆”措施,除了提示使用者程序出错的类型外,能够让程序的其他功能继续运行,而不是崩溃退出整个程序。

二、Python异常处理的语法

1.try...except语句

try:
    block1(通常是一个函数或者一段代码)
except [ExceptionName [as alias]]:
    block2

其中

try的意思是尝试运行,block1应该是一段有可能出现异常的代码段。

except是出现异常的处理,方括号内可以省略,表述的是能够捕获的异常类型名,如果捕获成功,则执行block2代码

如:

其中ZeroDivisionError是一个系统默认定义好的除零异常。

如果此处不写,那表示可以接受任何异常。

不能乱写,没定义的异常将出错。

可以紧跟多个except处理多个异常

再比如:

分苹果程序,如果输入的时候,苹果个数输入一个浮点数。输入2.6产生错误。这是一个导致程序中断的硬错误。

 我们可以编写异常处理程序,让程序软着陆

添加ValueError异常处理。

2.处理多个异常

可以通过一个except语句,处理多个异常,缺点是不能个性化展示异常提示。

 

 3.try ... except ... else

else可以处理没发现异常的情况

 例如:

 4.try ... except ... finally

finally表示,无论是否出现异常,都执行一段固定代码

例如:

 对于系统内置的异常,总结起来可以参考下图来进行处理:

 5.raise语句主动抛出异常

之前的几种情况,都是系统自动抛出异常,也可以使用raise语句来主动抛出异常。

类似于Java或C++中的throw

  1. raise [ExceptionName [(reason)]]

不加参数,原封不动抛出当前异常

使用ExceptionName,指定一个异常

reason在抛出时设置异常的提示信息

 例如:如果苹果个数少于同事个数,就会引发不正确答案。抛出异常。终止程序。

如果不捕获异常,则抛出异常,但硬终止。

 还要注意。raise抛出的异常类型要合理。如上例中,如果抛出其他如KeyError等异常,会给使用函数的程序员造成不必要的误解。

6.自定义异常

上面描述的异常都是系统内置的异常,如KeyError,ValueError等。

用户也可以根据情况需要自己定义异常。

自定义异常可以直接定义异常名,也可以定义更强大的异常类。

6.1直接定义异常名

如上例中,可以定义一个tooFewApples的自定义异常,在except中捕获这个异常。

 6.2自定义异常处理类

自定义一个tooFreApples类,可以在类里定义属性和方法,方便细粒度的操作异常。

如下图所示。

 7.Python的经典内置异常

EOFError 没有输入或者文件指针在EOF

Exception 所有异常的基类

IOError 输入输出操作失败

IndexError 序列的索引超出范围。

ValueError 函数接受到无效值

OverflowError 算术运算结果超出范围

NameError 变量在局部或者全局范围内不可用

RuntimeError 生成的错误不属于任何类别

SyntaxError Python语法错误

三、断言

用于判断一个表达式,在表达式条件为 false 的时候触发异常。

断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况。

1.assert

        assert expression

        等价于:

         if not expression:    

                raise AssertionError

举例说明:

 

>>> assert 1==1  # 条件为 true 正常执行
>>> assert 1==2  # 条件为 false 触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

2. 带参数的assert

        assert expression [, arguments]

例如:

>>> assert 1==2, '1 不等于 2'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: 1 不等于 2

学会了就点个赞吧。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎风工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值