什么是异常与异常处理
异常就是错误
异常会导致程序崩溃并停止运行
能监控并捕获到异常,将异常部位的程序进行修理使得程序继续正常运行
捕获具体异常
确定是哪种异常的情况下使用的捕获方法
try:
1/0
except ZeroDivisionError as e:
print(f'错误信息:{e}') #错误信息:division by zero
捕获通用异常
无法确定是哪种异常的情况下使用的捕获方法
try:
1/0
except Exception as e:
print(f'错误信息:{e}') #错误信息:division by zero
捕获多个异常
当except代码块有多个的时候,当捕获到第一个后,不会继续往下捕获
try:
a = 1/0
n = 2
s = n.upper()
except ZeroDivisionError as e:
print(f'错误信息:{e}') #错误信息:division by zero
except Exception as e:
print(f'错误信息:{e}') #不会再往下捕获错误
当except代码后边的异常类型使用元组包裹起来,捕获到哪种就抛哪种异常
try:
print(name)
except (ZeroDivisionError,NameError) as e:
print(f'错误信息:{e}') #错误信息:name 'name' is not defined
异常类型集合
Exception:通用类型(基类)
ZeroDivisonError:不能整除0
AttributeError:对象没有这个属性
IOError:输入输出操作失败
IndexError:没有当前的索引
KeyError:没有这个键值(key)
NameError:没有这个变量(未初始化对象)
SyntaxError:python语法错误
SystemError:解释器的系统错误
ValueError:传入的参数错误
finally
无论是否发生异常,一定会执行的代码块,在函数中,即便在try或except中进行了return也依然会执行finally语法块;
try语法至少要伴随except或finally中的一个
def except_case():
try:
1/0
except Exception as e:
print(f'错误信息:{e}')
finally:
return 'finally'
print(except_case())
'''
错误信息:division by zero
finally
'''
如果try、except和finally都存在return,则最后只返回finally的return内容
自定义异常与抛出异常
raise:将信息以报错的形式抛出
def test(number):
if number == 100:
raise ValueError('num 不能是100')
return number
test(100) #报错:ValueError: num 不能是100
"""使用try同样可以捕获异常"""
try:
test(100)
except Exception as e:
print(e)
raise #单独使用raise也是可以抛出异常 ValueError: num 不能是100
自定义异常类:
继承基类–Exception,在构造函数中定义错误信息
class NumberLimitError(Exception):
def __init__(self,message):
self.message = message
class NameLimitError(Exception):
def __init__(self,message):
self.message = message
def test(name):
if name == '兮兮':
raise NameLimitError('名字不能是兮兮')
return name
def test2(number):
if number > 60:
raise NumberLimitError('数字不能超过60')
return number
try:
test('兮兮')
except Exception as e:
print(e) #名字不能是兮兮
try:
test2(89)
except Exception as e:
print(e) #数字不能超过60
try/except…else
在没有捕捉到异常的时候,执行else语句的内容
try:
1/2
except Exception as e:
print(e)
else:
print('运行成功,程序没有出错')