什么是异常与异常处理
异常就是错误
异常会导致程序崩溃并停止运行
能监控并捕获到异常,将异常部位的程序进行修理使得程序继续正常运行
异常的语法结构
try:
<代码块1> 被try关键字检查并保护的业务代码
except <异常的类型>:
<代码块2> # 代码块1出现错误后执行的代码块
捕获通用异常
无法确定是哪种异常的情况下使用的捕获方法
try:
<代码块>
except Exception as e:
<异常代码块>
def upper(str_data):
new_str = ''
try:
new_str = str_data.upper()
except Exception as e:
print('程序出错了:{}'.format(e))
return new_str
result = upper(1)
print('result:', result)
程序出错了:'int' object has no attribute 'upper'
result:
捕获具体异常
确定是哪种异常的情况下使用的捕获方法
except <具体的异常类型> as e
def test():
try:
print('123')
1 / 0
print('hello')
except ZeroDivisionError as e:
print(e)
test()
123
division by zero
捕获多个异常1
try:
print('try start')
res = 1 / 0
print('try finish')
except ZeroDivisionError as e:
print(e)
except Exception as e: # 可以有多个except
print('this is a public excpt, bug is: %s' %e)
当except代码块有多个的时候,当捕获到第一个后,不会继续往下捕获。
捕获多个异常2
try:
print('try start')
res = 1 / 0
print('try finish')
except (ZeroDivisionError, Exception) as e:
print(e)
当except代码后边的异常类型使用元组包裹起来,捕获哪种就抛哪种
def test1():
try:
print('hello')
print(name)
except (ZeroDivisionError, NameError) as e:
print(e)
test1()
hello
name 'name' is not defined
异常类型集合
异常名称 | 说明 |
Exception | 通用异常类型(基类) |
ZeroDivisionError | 不能整除0 |
AttributeError | 对象没有这个属性 |
IOError | 输入输出操作失败 |
IndexError | 没有当前的索引 |
KeyError | 没有这个键值(key) |
NameError | 没有这个变量(未初始化对象) |
SyntaxError | Python语法错误 |
SystemError | 解释器的系统错误 |
ValueError | 传入的参数错误 |
# coding: utf-8
class Test(object):
pass
t = Test()
try:
t.name
except AttributeError as e:
print(e)
d = {'name': 'xiaomu'}
try:
d['age']
except KeyError as e:
print('没有对应的键:', e)
l = [1, 2, 3]
try:
l[5]
except IndexError as e:
print(e)
name = 'dewei'
try:
int(name)
except ValueError as e:
print(e)
def test(a):
return a
try:
test()
except TypeError as e:
print(e)
finally的功能
无论是否发生异常,一定会执行的代码块
在函数中,即便在try或except中进行了return也依然会执行finally语法块
try语法至少要伴随except或finally中的一个
finally的用法
try:
<代码块1>
except:
<代码块2>
finally:
<代码块3>
def test2():
try:
1 / 0
except Exception as e:
print('except')
return e
finally:
print('finally')
print('------------')
result = test2()
print(result)
def test5():
try:
print('1 try')
return 'try'
except Exception as e:
print('e')
finally:
print('2 finally')
return 'finally'
print('=======')
result = test5()
print(result)
finally的历史
在Python2.5之前的版本,finally需要独立使用,不可以和try配合,之后才演变成现在的模式。
自定义抛出异常函数--raise
将信息以报错的形式抛出
用法:
rasie 异常类型(message)
参数:
message:错误信息
返回值:无
def test4(name):
if name == 'dewei':
raise Exception('dewei不可以被填写')
return name
test4('dewei')
自定义异常类
继承基类 Exception
在构造函数中定义错误信息
class NumberLimitError(Exception):
def __init__(self, message):
self.message = message
class NameLimitError(Exception):
def __init__(self, message):
self.message = message
def test5(name):
if name == 'dewei':
raise NameLimitError('dewei不可以被填写')
return name
def test6(number):
if number > 100:
raise NumberLimitError('数字不可以大于100')
return number
断言的功能--assert
用于判断一个表达式,在表达式条件为false的时候触发异常
断言的用法--assert
用法:
assert expression, message
参数:
expression: 表达式,一般是判断相等,或者判断是某种数据类型的bool判断的语句
message:具体的错误信息
返回值:
无返回值
bug定义
程序中出现的错误,但有没有通过异常去捕获,以至于直接抛出,导致程序的崩溃。
可以使用debug和断点的方式进行调试。