5 异常处理
异常是程序发生错误的信号。程序一旦出现错误,便会产生一个异常,若程序中没有处理它,就会抛出该异常,程序的运行也随之终止。
'''
Traceback:异常的追踪信息
'''
# 2.错误分为两种:
# 语法错误:在程序执行前就要立刻改正过来
# 逻辑错误
# TypeError:数字类型无法与字符串类型相加
1+’2’
# ValueError:当字符串包含有非数字的值时,无法转成int类型
int("aaa")
# NameError:引用了一个不存在的名字x
x
# IndexError:索引超出列表的限制
l=['egon','aa']
l[3]
# KeyError:引用了一个不存在的key
dic={'name':'egon'}
dic['age']
# AttributeError:引用的属性不存在
class Foo:
pass
Foo.x
# ZeroDivisionError:除数不能为0
1/0
1 异常处理
为了保证程序的容错性与可靠性,即在遇到错误时有相应的处理机制不会任由程序崩溃掉,我们需要对异常进行处理,处理的基本形式为
try:
被检测的代码块
except 异常类型:
检测到异常,就执行这个位置的逻辑
- 强调一:错误发生的条件如果是可以预知的,此时应该用if判断去预防异常
age = 10
cmd = input('>>>:').strip()
if cmd.isdigit():
cmd = int(cmd)
if cmd > age:
print('太大了')
- 强调二:错误发生的条件如果是不可预知的,此时应该用异常处理机制,try...except...
# 前提我们根本就不知道文本有多少行,何时出错。
try:
f = open('a.txt', 'r', encoding='utf-8')
print(next(f), end='')
print(next(f), end='')
print(next(f), end='')
f.close()
except StopIteration:
print('出错了...')
2 详细用法
- 异常的多分支(被监控的代码块异常有多种可能性,为每一个异常处理单独的逻辑)
try:
print(">>>>1")
name
print(">>>>2")
l = [1, 2, 3]
l[10]
except NameError as e:
print("错误信息赋值给了e", e)
except IndexError as e:
print("错误信息赋值给了e", e)
print('执行完毕..')
-
万能异常(Exception,被检测到代码块抛出异常有多种可能性,并且针对所有异常类型都只用一种处理逻辑)
try: print(">>>>1") name print(">>>>2") l = [1, 2, 3] l[10] except Exception as e: print("异常:", e) print('执行完毕..') -
其他结构
finally: # finally通常使用在回收资源这块
try: print(">>>>1") name print(">>>>2") l = [1, 2, 3] l[10] except NameError as e: print("错误信息赋值给了e", e) except IndexError as e: print("错误信息赋值给了e", e) except Exception as e: print("异常:", e) else: print("在被检测的代码块没有发生异常时执行..") finally: # finally通常使用在回收资源这块 print("不管被检测的代码块有没有发生异常都会执行..") print('执行完毕..')
3 raise
主动触发异常:raise 异常类型(值)
class People:
def __init__(self, name, age):
if not isinstance(name, str):
raise TypeError('名字需传入str类型')
if not isinstance(age, int):
raise TypeError('年龄需传入int类型')
self.name = name
self.age = age
p = People('egon', 12)
4 断言
assert断言:断定一件事成立,如果不成立抛出异常。
info = {}
info['name'] = 'alex'
info['age'] = 19
assert ('name' in info) and ('age' in info)
if info['name'] == 'alex' and info['age'] == 19:
print('welcome')
5 自定义异常
继承BaseException类
class MyException(BaseException):
def __init__(self, msg):
super(MyException, self).__init__()
self.msg = msg
def __str__(self):
return '<%s>' % self.msg
raise MyException('我自己的异常类型')

浙公网安备 33010602011771号