Python异常
文章目录
- 异常
-
- 异常的使用
- 捕获通用异常
- 捕获具体异常
- 捕获多个异常
- 常用异常类型
- 异常中的finally
- 自定义异常与抛出异常
-
- 抛出异常
- 自定义异常类
- 断言
异常
- 异常就是错误
- 异常会导致程序崩溃并停止运行
- 能监控并捕获到异常,将异常部位的程序进行修理使得程序继续正常运行
异常的使用
'''
try:<代码块1>被try关键字检查并保护的业务代码
except<异常的类型>:<代码块2>代码块1出现错误后执行的代码块
'''
def upper (str_data):new_str = str_data.upper()return new_strresult = upper (1)
print (result)>>AttributeError: 'int' object has no attribute 'upper'
对于上面的函数,如果不加任何处理的话,就会报错,添加了try代码块后,可以看到程序仍会继续运行
def upper (str_data):new_str = 'None'try:new_str = str_data.upper()except:print ('程序出错了')return new_strresult = upper (1)
print (result)>>程序出错了
>>None
捕获通用异常
'''
try:<代码块>
except Exception as e:<异常代码块>
'''
def upper (str_data):new_str = 'None'try:new_str = str_data.upper()except Exception as e:print ('程序出错了{}'.format(e))return new_strresult = upper (1)
print (result)>>程序出错了'int' object has no attribute 'upper'
>>None
捕获具体异常
'''
try:<代码块>
except <具体异常类型> as e:<异常代码块>
'''
def test ():try:1/0print ('hello') #该代码不会执行except ZeroDivisionError as e:print (e)
test()>>division by zero
捕获多个异常
当except代码块有多个的时候,当捕获到第一个后不会继续往下捕获
方法一:
def test ():try:print ('hello') print (name)except (ZeroDivisionError, NameError) as e:print (e)
test()>>name 'name' is not defined
方法二:
def test ():try:print ('hello') print (name)except ZeroDivisionError as e:print (e)except NameError as e:print (e)
test()>>name 'name' is not defined
常用异常类型
异常集合1:
异常名称 | 说明 |
---|---|
Exception | 通用异常类型 |
ZeroDivisionError | 不能整除0 |
AttributeError | 对象没有这个属性 |
IOError | 输入输出操作失败 |
IndexError | 没有当前的索引 |
异常集合2:
异常名称 | 说明 |
---|---|
KeyError | 没有这个键 |
NameError | 没有这个变量 |
SyntaxError | 语法错误 |
SystemError | 解释器系统错误 |
ValueError | 传入的参数错误 |
异常中的finally
无论是否发生异常,一定会执行的代码块
在函数中,即便在try或except中进行了return也会依然执行finally语法块
try语法至少要伴随exception或finally中的一个
'''
try:<代码块1>
except:<代码块2>
finally:<代码块3>
'''def test1():try:1/0except Exception as e:print (e)finally:return 'finally'
result = test1()
print (result)>>division by zero
>>finallydef test1():try:1/0except Exception as e:print ('111')return efinally:print ('finally')
result = test1()
print (result)>>111
>>finally
>>division by zero#使用的是finally里返回的值
def test1():try:1/0except Exception as e:print ('111')return efinally:print ('222')return 'finally'
result = test1()
print (result)>>111
>>222
>>finally#finally和try的组合使用
def test1():try:print ('111')1/0print ('222')finally:print ('333')return 'finally'
result = test1()
print (result)>>111
>>333
>>finally
自定义异常与抛出异常
抛出异常
# 自定义抛出异常函数 --raise
'''
raise 异常类型(message)message:错误信息
'''
def test (number):if number == 100:raise ValueError ("number 不可以100")def test2 (number):try:return test (number)except ValueError as e:return e
result = test2 (100)
print (result)>>number 不可以100def test4 (name):if name == 'djk':raise Exception ('djk nonono')return name
test4('djk')>>Exception: djk nonono
自定义异常类
- 继承基类
- 在构造函数中定义错误信息
class NumberLimitError (Exception):def __init__ (self, message):self.message = messageclass NameLimitError (Exception):def __init__(self, message):self.message = message
def test5 (name):if name == 'djk':raise NameLimitError('djk nonono')return name
def test6 (number):if number > 100:raise NumberLimitError ("no 100")return numbertry:test5('djk')
except NameLimitError as e:print (e)try:test6(101)
except NumberLimitError as e:print (e) >>djk nonono
>>no 100
断言
用于判断一个表达式,在表达式条件为false的时候触发异常
'''
assert expression,messageexpression:表达式,一般是判断相等,或者判断是某种数据类型的bool判断的语句
message:具体的错误信息
'''
assert 1 == 1 #不会触发
assert 1 > 2,"1小于2"