捕获异常_python 异常捕获方法总结

异常捕获

当发生异常时,我们就需要对异常进行捕获,然后进行相应的处理。python 的异常捕获常用 try…except…结构,把可能发生错误的语句放在 try 模块里,用 except 来处理异常,每一个 try,都必须至少对应一个 except。此外,与 python 异常相关的关键字主要有:

7c2dc63b7a81eee695d0a07ab12f7d8c.png

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+’))

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值