1、异常的产生和捕获
程序在运行的过程中可能会因为权限问题、用户输入问题、第三方API问题、请求参数确实 等问题产生异常,这些异常可以在程序内部通过捕获异常让程序继续执行,也可以选择通过raise抛出异常让程序终止运行,如果不进行异常处理,异常最终会被python解释器捕获并终止运行程序
2、基本语法
1、try...except...else...finally
def func(x):
return 2 / x
if __name__ == "__main__":
try: #编写可能会产生异常的代码
res = func(0)
except ZeroDivisionError as e: #产生异常处理逻辑
print(e)
else: #没有产生异常处理逻辑
logging.debug('no exception')
finally: #无论是否产生异常均会执行的逻辑
logging.debug('i was excute')
print('END')
输出结果:
3、记录错误
我们可以捕获错误,并把错误堆栈打印出来,然后分析错误原因,同时,让程序继续执行下去。
import logging
def func(x):
return 2 / x
if __name__ == "__main__":
try:
res = func(0)
except ZeroDivisionError as e:
logging.exception(e)
else:
logging.debug('no exception')
finally:
logging.debug('i was excute')
print('END')
4、自定义异常和抛出异常
1、当用户输入0时,会抛出已经定义好的valueException异常,程序终止运行,不会打印 'continue',会被exception捕获打印堆栈信息并执行finally语句块
2、raise
语句如果不带参数,就会把当前错误原样抛出,让上层调用者处理,如果上层调用者也没有捕获,则最终会被python解释器捕获并终止运行程序
import logging
class valueException(Exception):
pass
# lambda x:x % 2 == 1
def func(x):
return 2 / x
if __name__ == "__main__":
n = input('请输入任意一个数字:')
try:
n = int(n)
if n == 0:
raise valueException('参数不能为0')
print('continue...')
res = func(n)
except Exception as e:
logging.exception(e)
# print(e)
else:
print('no exception')
finally:
print('i was excute')
输出结果: