Python的异常处理机制
Python提供了异常处理机制,可以在异常出现时即时捕获,然后内部“消化”,让程序继续运行
多个except结构
捕获异常的顺序按照先子类后父类的顺序,为了避免遗漏可能出现的异常,可以在最后增加BaseException
try...except...else结构
如果try块中没有抛出异常,则执行else块,如果try中抛出异常,则执行except块
try...except...else..finally结构
finally块无论是否发生异常都会被执行,能常用来释放try块中申请的资源
案例1
try: a = int(input('请输入第一个整数:')) b = int(input('请输入第二个整数:')) result = a/b print('结果为:',result) except ZeroDivisionError: print('对不起,除数不能为0') except ValueError: print('只能输入数字串') print('程序结束')
案例2
try: a = int(input('请输入第一个整数:')) b = int(input('请输入第二个整数:')) result = a/b except BaseException as e: print('出错了',e) else: print('计算结果为:',result) finally: print('谢谢你的使用')
案例3
#异常处理的本质是 解释器抛出异常->捕获异常->解决异常 ''' 输入被除数和除数,输出商 会出现2种异常问题 1.输入的字符并不是数字,不能转换为int 2.除数为0 解决方法 1.输入后判断isdigit()再判断!=0 但是会导致业务偏移 2.异常处理 ''' a=input("请输入被除数:") b=input("请输入除数:") ''' if a.isdigit() and b.isdigit(): if int(b) != 0: a=int(a) b=int(b) print("商:",a/b) ''' try: a = int(a) b = int(b) print("商:", a / b) except TypeError: print("输入类型有误") except ZeroDivisionError: print("除数不能为0") except BaseException as e: #添加后可以涵盖所有异常,属于父类,父类放在异常捕获的最后 print("其他异常") print(e) print(type(e)) #try将可能出现异常的代码放入,except是try内代码出现异常时执行的语句 ''' except (ValueError,Exception,ZeroDivisionError) as e: 将多种异常放在元组中,不需要注意顺序,且可以将异常储存为e输出type type(e) 获取异常类型 e.args 获取异常信息 '''
Python中常见的异常
ZeroDivisionError :除(或取模)零(所有数据类型)
IndexError:序列中没有此索引(index)
KeyError:映射中没有这个键
NameError:未声明/初始化对象(没有属性)
SyntaxError:Python语法错误
ValueError:传入无效的参数
traceback
使用traceback模块打印异常信息
import traceback
try:
a= 1/0
except:
traceback.print_exc()
把日志信息放到日志文件里面
Traceback (most recent call last): File "F:\pythonProject1\venv\test.py", line 3, in <module> a = 1/0 ZeroDivisionError: division by zero