Python异常处理详解
当python检测到一个错误时,解释器就无法继续运行了,反而出现了一些错误的提示,这就是所谓的异常。处理异常的方法就是用try语句来捕获异常避免程序终止。
目录
前言
正文
一、常见的报错类型
1、语法错误
2、逻辑错误
二、基本异常处理
1、基本语法:
2、多异常捕获
1)、多个except语句
2)、 使用元组同时匹配多个异常
3、万能异常 Exception
三、进阶异常处理
四、raise抛出异常
拓展
总结
前言
Python中,程序执行过程中发生的错误或异常情况。当出现异常时,程序会停止执行并抛出一个异常对象,如果没有适当的处理机制,程序将会终止运行。为了避免直接停止程序,提高程序的容错性和可靠性,我们通常会使用try语句来处理异常。
正文
一、常见的报错类型
常见的报错分为两种:
1、语法错误
这种错误在代码编写阶段就能被检测到,因为它违反了Python的语法规则。常见的语法错误包括拼写错误、缩进错误、语法结构错误等。
2、逻辑错误
这种错误在代码运行时不会引发异常,但导致程序的行为与预期不符。逻辑错误通常是由于程序员的错误理解或错误的实现导致的。例如,算法错误、变量赋值错误、条件判断错误等。
当出现错误时python解释器会抛出异常对象,并提示错误原因,以下是常见的异常信息与报错原因:
二、基本异常处理
1、基本语法:
try:
print("被检测的语句")
except 检测报错类型 as e:
# as是把捕获到的异常赋值给变量e 输出e得到具体的异常信息
print(e)
例如:输入两个整数进行除法运算
try:
num1 = int(input('请输入整数:'))
num2 = int(input('请输入整数:'))
print("num1/num2=", num1 / num2)
except ValueError as e: # 检测是否有ValueError错误 如果有则执行 except里面的语句
# as是把捕获到的异常赋值给变量e 输出e得到具体的异常信息
print('出现异常:', e) # 捕获到异常则输出:出现异常:invalid literal for int() with base 10: '1.2'
上述 代码中如果输入的不是整数则会输出e捕获到的异常信息,如果输入的正确则正常执行代码。
即try对应的代码块里没有检测到异常,会跳过except继续执行后面的代码。
如果try对应的代码块中出现了异常则执行except语句,先和except后指定的异常类型进行匹配,匹配成功捕获到异常输出对应的代码块。匹配失败则不能捕获
2、多异常捕获
通常在代码中可能一段代码出现多种异常,这样我们则可以使用多异常捕获来进行
1)、多个except语句
类似于if-else语句会一个一个进行判断,如果匹配成功则执行对应的except中的语句,直到最后。
try:
num1 = int(input('请输入整数:'))
num2 = int(input('请输入整数:'))
print("num1/num2=", num1 / num2)
except ValueError as e: # 检测是否有类型错误 如果有则执行 except里面的语句
# as是把捕获到的异常赋值给变量e 输出e得到具体的异常信息
print('输入的不是整型')
except ZeroDivisionError as e: # 捕获除数为零的异常
print('除数不能为零')
2)、 使用元组同时匹配多个异常
try:
num1 = int(input('请输入整数:'))
num2 = int(input('请输入整数:'))
print("num1/num2=", num1 / num2)
except (ValueError,ZeroDivisionError) as e: # 检测是否出现元组中的错误 如果有则执行 except里面的语句
# as是把捕获到的异常赋值给变量e 输出e得到具体的异常信息
print('出现异常:', e)
3、万能异常 Exception
可以用于匹配大多数异常,如果是语法错误则捕获不到。
try:
num1 = int(input('请输入整数:'))
num2 = int(input('请输入整数:'))
print("num1/num2=", num1 / num2)
except Exception as e: # 用于捕获大多数逻辑错误所引发的异常
print('出现异常:', e)
如以下输入于结果:
三、进阶异常处理
try:
print("被检测的语句")
except 检测报错类型 as e:
# as是把捕获到的异常赋值给变量e 输出e得到具体的异常信息
print(e)
else:
print('没有捕获到异常执行')
finally: # 主要用于资源回收的作用,如在对文件进行操作时,不管有没有报错都对文件进行关闭的操作
print('一定会执行的语句')
例
代码:
try:
num1 = int(input('请输入整数1:'))
num2 = int(input('请输入整数2:'))
print('num1/num2=', num1 / num2)
except Exception as e:
# as是把捕获到的异常赋值给变量e 输出e得到具体的异常信息
print(e)
else:
print('没有捕获到异常执行')
finally:
print('一定会执行的语句')
运行结果:
没有异常的结果:
捕获到异常的结果:
四、raise抛出异常
不符合python语法的由python解释器主动抛出异常
而raise则是由程序员,自定义规则来抛出异常
语法:
# 1、使用Exception创建异常对象
e = Exception('自定义异常')
# 2、使用raise抛出异常
raise e
运行结果:触发报错,报错信息为,自己创建的异常对象内容
但是抛出异常并不是为了让代码崩溃,而是为了拦截代码不符合预期的走向,所以常常于异常捕获一起使用,如:
def func():
num = input('请输入6-10位密码:')
if 6 > len(num) or len(num) > 10:
raise Exception('密码位数错误')
print('密码正确')
try:
func()
except Exception as e:
print('触发异常', e)
运行结果:
拓展
在python中for于while后面也是可以接else语句的。当else语句和循环链接,如果循环没有被break终止则会输出else里面的内容,否则不输出。
没有被break终止代码:
for i in range(10):
print(i, end='\t')
else:
print('\n循环已到最后')
运行结果:
被break终止:
for i in range(10):
if i == 4:
break
print(i, end='\t')
else:
print('\n循环已到最后')
运行结果:
总结
一个程序中出现报错,对于用户的体验是非常不好的,如果多使用异常处理则可以有效的避免这种情况,提高程序的容错性与可靠性。
作者:写代码也摆烂