当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”,也就是bug
当我们的程序遇到bug,那么就下来有两种情况
①整个程序因为一个bug停止运行
②对bug进行提示,整个程序继续运行
捕获异常的作用在于:提前假设某处会出现异常,做好提前准备,当真的出现异常的时候,可以有后续手段。
try:
? ? ? ? 可能发生错误的代码
except:
? ? ? ? 如果出现异常执行的代码
需求:尝试以‘r’模式打开文件,如果文件不存在,则以‘w’方式打开
try:
? ? ? ? f = open('python.txt', 'r, encoding = 'utf-8')
except:
? ? ? ? f = open('python.txt', 'w, encoding = 'utf-8')
try:
? ? ? ? print(1 / 0)
except NameError as a:
? ? ? ? print(f'出现变量名称异常:{a}')
except ZeroDivisionError as b:
? ? ? ? print(f'出现^异常:{b}')
try:
????????# print(name)
? ? ? ? 1 / 0
except (NameError, ZeroDivisionError) as a:
????????print(f'捕获到的异常是:{a}')?
# 两种一样的写法,都可以捕获到全部异常
# 第一种方式
# try:
#
# except:
# 第二种方式
try:
? ? ? ? # print(name)
? ? ? ? 1 / 0
except Exception as a:
? ? ? ? print(f'出现异常了:{a}')
(这两个参数是可选的)
else表示的是如果没有异常要执行的代码
name = 'hello'
try:
print(name)
except Exception as a:
print(f'出现异常了,且为{a}类型')
# finally一般用在文件的相关操作中,因为不管怎么最后都要关闭文件
finally:
print('hello,不管怎样我都会在的')
当函数func01中发生异常,并且没有捕获处理这个异常的时候,异常会传递到函数func02中,当func02也没有捕获处理这个异常的时候,main函数会捕获这个异常,这就是异常的传递
需要注意的是:
当所有函数都没有捕获异常的时候,程序就会报错
程序结果:
# 定义一个出现异常的函数
def func01():
print('这是func01函数的起始')
print(name)
print('这是func01函数的结束')
# 定义一个不会出现异常的函数
def func02():
print('这是func02函数的起始')
func01()
num = 1 / 0
print('这是func02函数的结束')
# 定义一个函数调用上面的函数
def main():
print('main函数开始执行')
try:
func02()
except Exception as a:
print(f'出现异常了,并且异常为:{a}')
finally:
print('我一直都在')
print('main函数执行完毕')
if __name__ == '__main__':
main()
程序执行结果:
从程序的执行结果可以看出
①执行的是main函数
②进入函数func02
③进入函数func01
④由于函数func01中出现了错误,导致并非正常退出函数,而是中断函数
⑤执行finally
⑥输出最后一个print语句
干货可能不多,但是的确不难,异常可以提高程序的健壮性,还是可以在之后自己开发的程序中加入异常捕获的。