Python疯狂讲义(异常处理、Python类的特殊方法、模块和包)

六、异常处理

Python的异常机制主要依赖try、except、else、finally、raise五个关键字,其中在try关键字后缩进的代码块简称try块,里面放置的是可能引发异常的代码;在except后对应的是异常类型和一个代码块,用于表明该except块处理的这种类型的代码块;在多个except后可以放一个else块,表明程序不出现异常时需要在执行else部分;最后添加finally块,总被执行;raise用于引发一个实际的异常,raise可以单独作为语句使用,引发一个具体的异常对象。

1、异常概述

错误处理机制两大缺点:

  1. 无法穷举所有的异常情况;
  2. 错误处理代码和业务实现代码混杂;

2、异常处理机制

2.1、使用try…except捕获

try:
	# 业务实现代码
except (Error1, Error2, ... ): as e:
	alert 输入不合法
	goto retry	

如果在执行try块里的业务逻辑代码时出现异常,系统自动生成一个异常对象,该异常对象被提交给Python解释器,过程被称之为引发异常。
当Python解释器收到异常对象时,会寻找能处理该异常对象的except块,如果找到合适的except块,则把该异常对象交给该except块处理,过程被称之为捕获异常。
如果无法捕获异常,则运行时环境终止,Python解释器退出。

InputInt = input("请输入整型数据:\n")
try:
    if int(InputInt) >= 18:
        print('成年!')
    else:
        print("未成年!")
except:
    print('输入数据类型有误,请重新输入')

2.2、异常类的继承体系

当Python解释器接收到异常对象后,会依次判断该异常对象是否是except块后的异常类或其子类的实例,如果是,Python解释器将调用该except块来处理该异常;否则,再次拿该异常对象和下一个except块里的异常类进行比较。
Python捕获异常的流程图:

try:
	statement1
	statement1    # 出现异常生成异常对象ex
	...
except Exception1:instance(ex, Exception1)
	exception handler statement1	
	...
except Exception2:instance(ex, Exception2)
	exception handler statement1	
	...
import sys
try:
    a = int(sys.argv[1])
    b = int(sys.argv[2])
    c = a / b
    print('两数相除的结果是:{0}'.format(c))
except IndexError:
    print("索引错误,运行程序时输入的参数个数不够")
except ValueError:
    print("数值错误,程序运行只能接受整数")
except ArithmeticError:
    print("算数错误")
except Exception:
    print("未知错误")

IndexError:输入的参数不够,将会发生索引错误;
ValueError:输入的参数不是数字,而是字母等,将会发生数值错误;
ArithmeticError:除0异常,将会发生算数错误;
Exception:其他异常;

2.3、多异常捕获

Python的一个except块可以捕获多种类型的异常。
在使用一个except块捕获多种类型的异常时,只要将多个异常类用圆括号括起来,中间用逗号隔开即可(构建多个异常类的元组)。

import sys
try:
    a = int(sys.argv[1])
    b = int(sys.argv[2])
    c = a / b
    print('两数相除的结果是:{0}'.format(c))
except (IndexError, ValueError, ArithmeticError):
    print("索引错误/数值错误/算法错误")
except Exception:
    print("未知错误")

2.4、访问异常信息

在except块中访问异常对象的相关信息,通过为异常对象声明变量来实现。

  1. args:该属性返回异常的错误编号和描述字符串;
  2. errno:返回异常的错误编号;
  3. strerror:返回异常的描述字符串;
  4. with_traceback():通过该方法可处理异常的传播轨迹信息;
def foo():
    try:
        fis = open("a.txt")
    except Exception as e:
        print(e.args)
foo()       # (2, 'No such file or directory')

2.5、else块

当try没有出现异常时,程序会执行else块

s = input("请输入除数:\n")
try:
    result = 20 / int(s)
    print(result)
except ValueError:
    print("输入数值错误")
else:
    print('无异常')

2.6、使用finally回收资源

finally总会被执行,切必须放在所有except块之后。

s = '12'
try:
    result = 20 / int(s)
    print(result)
except ValueError:
    print("输入数值错误")
else:
    print('无异常')
finally:
    print('结束')

2.7、异常处理嵌套

在finally块中包含了一个完整的异常处理流程

import os
def test():
    fis = None
    try:
        fis = open("a.txt")
    except OSError as e:
        print(e.strerror)
        return
    finally:
        if fis is not
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值