异常捕获
当发生异常时,我们就需要对异常进行捕获,然后进行相应的处理。python 的异常捕获常用 try…except…结构,把可能发生错误的语句放在 try 模块里,用 except 来处理异常,每一个 try,都必须至少对应一个 except。此外,与 python 异常相关的关键字主要有:
![7c2dc63b7a81eee695d0a07ab12f7d8c.png](https://i-blog.csdnimg.cn/blog_migrate/d64952f7246be35c7f264b44a5636b99.jpeg)
1 捕获所有异常
包括键盘中断和程序退出请求(用 sys.exit() 就无法退出程序了,因为异常被捕获了),因此慎用。
try: except: print('异常说明')
2 捕获指定异常
try: except : print('异常说明')
万能异常:
try: except Exception: print('异常说明')
一个例子:
try: f = open("file-not-exists", "r")except IOError as e: print("open exception: %s: %s" %(e.errno, e.strerror))
3 捕获多个异常
捕获多个异常有两种方式,第一种是一个 except 同时处理多个异常,不区分优先级:
try: except (, , ...): print('异常说明')
第二种是区分优先级的:
try: except : print('异常说明1')except : print('异常说明2')except : print('异常说明3')
该种异常处理语法的规则是:
执行 try 下的语句,如果引发异常,则执行过程会跳到第一个 except 语句。
如果第一个 except 中定义的异常与引发的异常匹配,则执行该 except 中的语句。
如果引发的异常不匹配第一个 except,则会搜索第二个 except,允许编写的 except 数量没有限制。
如果所有的 except 都不匹配,则异常会传递到下一个调用本代码的最高层 try 代码中。
4 异常中的 else
如果判断完没有某些异常之后还想做其他事,就可以使用下面这样的 else 语句。
try: except : print('异常说明1')except : print('异常说明2')else: # try语句中没有异常则执行此段代码
5 异常中的 finally
try…finally…语句无论是否发生异常都将会执行最后的代码。
try: finally:
看一个示例:
str1 = 'hello world'try: int(str1)except IndexError as e: print(e)except KeyError as e: print(e)except ValueError as e: print(e)else: print('try内没有异常')finally: print('无论异常与否,都会执行我')
6 raise 主动触发异常
可以使用 raise 语句自己触发异常,raise 语法格式如下:
raise [Exception [, args [, traceback]]]
语句中 Exception 是异常的类型(例如 ValueError),参数是一个异常参数值。该参数是可选的,如果不提供,异常的参数是 "None"。最后一个参数是跟踪异常对象,也是可选的(在实践中很少使用)。
看一个例子:
def not_zero(num): try: if num == 0: raise ValueError('参数错误') return num except Exception as e: print(e)not_zero(0)
7 采用 traceback 模块查看异常 (RPA 已默认封装)
发生异常时,Python 能“记住”引发的异常以及程序的当前状态。Python 还维护着 traceback(跟踪)对象,其中含有异常发生时与函数调用堆栈有关的信息。记住,异常可能在一系列嵌套较深的函数调用中引发。程序调用每个函数时,Python 会在“函数调用堆栈”的起始处插入函数名。一旦异常被引发,Python 会搜索一个相应的异常处理程序。如果当前函数中没有异常处理程序,当前函数会终止执行,Python 会搜索当前函数的调用函数,并以此类推,直到发现匹配的异常处理程序,或者 Python 抵达主程序为止。这一查找合适的异常处理程序的过程就称为“堆栈辗转开解”(StackUnwinding)。解释器一方面维护着与放置堆栈中的函数有关的信息,另一方面也维护着与已从堆栈中“辗转开解”的函数有关的信息。
格式如下:
try: blockexcept: traceback.print_exc()
举个例子:
try: 1/0except Exception as e: print(e)
如果我们这样写的话,程序只会报“division by zero”错误,但是我们并不知道是在哪个文件哪个函数哪一行出的错。
下面使用 traceback 模块,官方参考文档:https://docs.python.org/2/library/traceback.html
import tracebacktry: 1/0except Exception as e: traceback.print_exc()
这样就会帮我们追溯到出错点:
Traceback (most recent call last):
File “E:/PycharmProjects/ProxyPool-master/proxypool/test.py”, line 4, in
1/0
ZeroDivisionError: division by zero
另外,traceback.print_exc()跟 traceback.format_exc() 有什么区别呢?
区别就是,format_exc()返回字符串,print_exc() 则直接给打印出来。即 traceback.print_exc()与 print(traceback.format_exc()) 效果是一样的。print_exc() 还可以接受 file 参数直接写入到一个文件。比如可以像下面这样把相关信息写入到 tb.txt 文件去。
traceback.print_exc(file=open(‘tb.txt’,‘w+’))