异常处理机制可以使程序有更好的容错性,提高程序健壮性;当程序运行时出现意外情况时,系统会自动生成一个Error对象通知程序。
一、try...except
异常处理机制的语法结构如下:
1 2 3 4 | try : # 业务实现代码 exception (Error1,Error2....) as e: # 异常处理逻辑代码 |
业务实现代码没有异常,例:
1 2 3 4 5 6 7 | try : print ( '没有异常' ) except Exception as e: print ( '出现异常:%s' % e) # 运行结果 没有异常 |
上面例子可以看出,当业务实现代码没有出现异常时,并不会运行except中的异常处理逻辑代码。
业务逻辑代码有异常,例:
1 2 3 4 5 6 7 8 9 10 | try : print ( '业务逻辑代码运行中...' ) p print ( '业务逻辑代码运行结束...' ) except Exception as e: print ( '出现异常:%s' % e) # 运行结果 业务逻辑代码运行中... 出现异常:name 'p' is not defined |
上面例子可以看出,当业务实现代码出现异常时,会自动生成异常对象提交给Python解释器,Python解释器会寻找能处理该异常对象的except块,如果找到,则把异常对象交给except块处理;如果Python解释器找不到except块,则运行时环境终止,Python解释器将会退出。
关于Python异常类型,可百度查看。
二、多异常捕获
在Python中,一个except块可以捕获多种类型的异常,只需把多个异常类用圆括号括起来,中间用逗号隔开(即元组)。
例:
1 2 3 4 5 6 7 | try : a except (SyntaxError,IndentationError,NameError) as e: print ( '出现错误:语法错误\缩进错误\未声明/初始化对象 (没有属性)' ,e) # 运行结果 出现错误:语法错误\缩进错误\未声明 / 初始化对象 (没有属性) name 'a' is not defined |
上面例子中,except块会捕获SyntaxError,IndentationError,NameError三种异常。因为在try中出现了NameError错误,所以会运行except块中的异常处理逻辑代码。
三、else块
python异常处理流中可以添加else块,else块会做try块没有出现异常时运行。
例:
1 2 3 4 5 6 7 8 9 10 11 | try : a = 1 print ( '正在运行try块...' ) except (SyntaxError,IndentationError,NameError) as e: print ( '出现错误:语法错误\缩进错误\未声明/初始化对象 (没有属性)' ,e) else : print ( 'try块没有出现异常,运行else块!' ) # 运行结果 正在运行 try 块... try 块没有出现异常,运行 else 块! |
如果try块出现异常,则else块不会运行,例:
1 2 3 4 5 6 7 8 9 10 11 | try : print ( '正在运行try块...' ) b except (SyntaxError,IndentationError,NameError) as e: print ( '出现错误:语法错误\缩进错误\未声明/初始化对象 (没有属性)' ,e) else : print ( 'try块没有出现异常,运行else块!' ) # 运行结果 正在运行 try 块... 出现错误:语法错误\缩进错误\未声明 / 初始化对象 (没有属性) name 'b' is not defined |
四、finally块
python的finally块在异常处理流中,不管try块中是否出现异常,都会执行,我们可以使用finally块执行回收资源的操作。
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | try : print ( '正在运行try块...' ) b except (SyntaxError,IndentationError,NameError) as e: print ( '出现错误:语法错误\缩进错误\未声明/初始化对象 (没有属性)' ,e) else : print ( 'try块没有出现异常,运行else块!' ) finally : print ( '不管try块是否出现异常,都会运行finally块!' ) # 运行结果 正在运行 try 块... 出现错误:语法错误\缩进错误\未声明 / 初始化对象 (没有属性) name 'b' is not defined 不管 try 块是否出现异常,都会运行 finally 块! |
即使在try块或者except块中执行了return语句,finally块也会被执行,但是如果在finally块中使用了return或者raise语句,将会导致try块和except块中的return和raise语句失效。
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | def test(): try : print ( '正在运行try块...' ) b = 'try块运行结束。' return b except (SyntaxError,IndentationError,NameError) as e: d = '出现错误:语法错误\缩进错误\未声明/初始化对象 (没有属性)' + e return d else : print ( 'try块没有出现异常,运行else块!' ) finally : p = '不管try块是否出现异常,都会运行finally块!' print (p) print (test()) # 运行结果 正在运行 try 块... 不管 try 块是否出现异常,都会运行 finally 块! try 块运行结束。 |
上面的例子中可以看出异常处理流的运行过程,先运行了try块,try块中没有出现异常,运行else块,然后再运行finally块,最后再跳回执行try块(except块)的return(raise)语句。
如果在finally块中执行了return或raise语句,则不再跳回执行try块或者except块的任何代码,例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | def test(): try : print ( '正在运行try块...' ) b = 'try块运行结束。' return b except (SyntaxError,IndentationError,NameError) as e: print ( '正在运行except块...' ) return e else : print ( 'try块没有出现异常,运行else块!' ) finally : p = '不管try块是否出现异常,都会运行finally块!' return p print (test()) # 运行结果 正在运行 try 块... 不管 try 块是否出现异常,都会运行 finally 块! |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步