参考 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 请输入除数:0output 出问题啦!
首先,系统没有报错,因为 try 中出错,则执行 except 中的内容,即打印‘出问题啦!’
当然,except会捕获try中所有可能出错的情况,但是 except异常也分为很多种,比如值异常,命名异常等。因为这里是除0了,所以我们可以用除0异常来捕获这个异常。
所有异常请参考 python异常总结 下面简单举两种异常的例子
用来捕获除数为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)当输入为
请输入被除数:10 请输入除数:aoutput 被除数和除数都应该是数值类型
成功捕获异常 2)当输入为
请输入被除数:10 请输入除数:0结果为 除数不能为0
成功捕获异常
output
error <class 'ZeroDivisionError'> division by zero打开文件,有写操作,写过程中出现了异常,跳到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 我是一定会执行的
成功捕获异常
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但是
我是一定会执行的还是被打印出来了
第一次运行因为文件不存在,会执行 except 部分
[Errno 2] No such file or directory: 'bryant.txt' do you want to create a new file:yes输入yes 后会创建文件空文件 bryant.txt 第二次运行,文件已存在,会执行 else 部分,写入了 Enchanter 的信息!
通过 raise 显示地引发异常。一旦执行了 raise 语句,raise 后面的语句将不能执行
raise ZeroDivisionError('除数为0')结果为
--------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) <ipython-input-18-9d1787340198> in <module>() ----> 1 raise ZeroDivisionError('除数为0') ZeroDivisionError: 除数为0答:可以。因为 try 语句块中可能出现多类异常,利用多个 except 语句可以分别捕获并处理我们感兴趣的异常。
答:因为它会隐藏所有程序员未想到并且未做好准备处理的错误,例如用户输入 ctrl+c 试图终止程序会被解释为 KeyboardInterrupt 异常。
https://www.runoob.com/python3/python3-assert.html
来自 python assert的作用