【ptyhon】异常处理(10)

参考 Python从零开始系列连载,by 王大伟 Python爱好者社区

参考 Hellobi Live | 1小时破冰入门Python

参考 《简明python教程》

参考 python异常总结

参考 try 错误处理

Note: 更多连载请查看【python】


最近一次修订时间为:2020-10-17



  程序运行报错了,就是发生了异常情况!有时候我们想让系统提供更具体的异常信息,帮助我们解决问题。有时候我们想忽略本次异常,让程序继续执行下去。
  那我们到底该怎么控制呢?
  在Python中,我们将可能出现异常的代码放在使用try…except 结构创建的 ’ 隔离区 ’ 里运行。具体结构如下

try:
  可能引起异常的代码
except Exception [as reason]:
  对异常的处理代码


以下代码能捕获try中所有异常

try:
    x = float(input('请输入被除数:'))
    y = float(input('请输入除数:'))
    z = x/y
    print(z)
except:
    print('出问题啦!')

根据提示输入
比如

请输入被除数:10
请输入除数:2

结果为
5.0

以上是正常情况,try 的代码部分没问题,所以相对的 except 的代码部分不会执行
如果输入如下

请输入被除数:10
请输入除数:0

output
出问题啦!

首先,系统没有报错,因为 try 中出错,则执行 except 中的内容,即打印‘出问题啦!’

当然,except会捕获try中所有可能出错的情况,但是 except异常也分为很多种,比如值异常,命名异常等。因为这里是除0了,所以我们可以用除0异常来捕获这个异常。


1 异常总结

所有异常请参考 python异常总结
下面简单举两种异常的例子

1.1 ZeroDivisionError

用来捕获除数为0的异常

try:
    x = float(input('请输入被除数:'))
    y = float(input('请输入除数:'))
    z = x/y
    print(z)
except ZeroDivisionError:
    print('除数不能为0')

1)当输入为

请输入被除数:10
请输入除数:0

结果为
除数不能为0

没有报错,成功捕获异常

2)当输入为

请输入被除数:10
请输入除数:a

结果会报错

ValueError: could not convert string to float: 'a'

没能捕获异常,当出现的不是除0错误时候,用除0异常就不能捕获其他种类的异常


1.2 ValueError

try:
    x = float(input('请输入被除数:'))
    y = float(input('请输入除数:'))
    z = x/y
    print(z)
except ZeroDivisionError:
    print('除数不能为0')
except ValueError:
    print('被除数和除数都应该是数值类型')

1)当输入为

请输入被除数:10
请输入除数:a

output
被除数和除数都应该是数值类型

成功捕获异常
2)当输入为

请输入被除数:10
请输入除数:0

结果为
除数不能为0

成功捕获异常


1.3 合起来用

try:
    1/0
except (TypeError,ZeroDivisionError) as reason:
    print("error")
    print(type(reason))
    print(reason)

output

error
<class 'ZeroDivisionError'>
division by zero

2 try-except-finally

打开文件,有写操作,写过程中出现了异常,跳到except,文件没有关闭,最终也没有写进去,所以不行
f.close() 放在finally就可以避免这种问题了

try:
  检测范围
except Exception[as reason]:
  出现异常(Exception)后的处理代码
finally:
  无论如何都会被执行的代码

try…except…finally…

当我们出现异常时候,可以采用捕获方法,如果异常没被捕获,则运行出错,但是有时,有些代码我们一定要让它运行(不管之前有没有运行出错),这时候,要在原先的try…except…结构中加入finally。

try:
    z = 1/0      
except ZeroDivisionError:
    print('除了0')
finally:
    print('我是一定会执行的')

output
除了0
我是一定会执行的

成功捕获异常


try:
    z = 1/0      
except ValueError:
    print('类型错误')
finally:
    print('我是一定会执行的')

output

我是一定会执行的
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-7-fa23f8c24e0c> in <module>()
      1 try:
----> 2     z = 1/0
      3 except ValueError:
      4     print('类型错误')
      5 finally:

ZeroDivisionError: division by zero

虽然结果会报错

ZeroDivisionError: division by zero

但是

我是一定会执行的

还是被打印出来了


下面看一个比较有趣的例子

def func():
    try:
        return 'from_try'
    finally:
        return 'from_finally'
        
print(func())

output

from_finally

函数的返回值由最后执行的 return 语句决定

3 try-except-else

我们在使用 try/except 语句的时候也可以加一个 else 子句,如果没有触发错误的话,这个子句就会被运行

try:
    file=open('bryant.txt','r+')
except Exception as e:
    print(e)
    response = input('do you want to create a new file:')
    if response=='yes':
        file=open('bryant.txt','w')
    else:
        pass
else:
    file.write('Enchanter')
    file.close()

第一次运行因为文件不存在,会执行 except 部分

[Errno 2] No such file or directory: 'bryant.txt'
do you want to create a new file:yes

输入yes 后会创建文件空文件 bryant.txt
在这里插入图片描述
第二次运行,文件已存在,会执行 else 部分,写入了 Enchanter 的信息!
在这里插入图片描述

4 raise

通过 raise 显示地引发异常。一旦执行了 raise 语句,raise 后面的语句将不能执行

raise ZeroDivisionError('除数为0')

结果为

---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-18-9d1787340198> in <module>()
----> 1 raise ZeroDivisionError('除数为0')

ZeroDivisionError: 除数为0

A 附录

Q1:一个 try 语句可以和多个 except 语句搭配吗?为什么?

答:可以。因为 try 语句块中可能出现多类异常,利用多个 except 语句可以分别捕获并处理我们感兴趣的异常。

Q2:except 后边如果不带任何异常类,Python 会捕获所有(try 语句块内)的异常并统一处理,但不建议这么做,你知道为什么吗?

答:因为它会隐藏所有程序员未想到并且未做好准备处理的错误,例如用户输入 ctrl+c 试图终止程序会被解释为 KeyboardInterrupt 异常。

assert 断言

在这里插入图片描述

https://www.runoob.com/python3/python3-assert.html

在这里插入图片描述
来自 python assert的作用

多次尝试

增加重试次数。这个在爬虫程序中比较常见,第一次请求超时,可能过一会再请求就成功了,所以重试几次可能会消除异常。

90%老手的都不知道,Python异常还能写得如此优雅!

attempts = 0
success = False
while attempts < 3 and not success:
    try:
        do_something()
        success = True
    except:
        attempts += 1
        if attempts == 3:
            break
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值