python try语句输入错误判断_python 异常捕获方法总结

原标题:python 异常捕获方法总结

了解下载RPA请访问:www.i-search.com.cn

异常捕获

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

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:

block

except:

traceback.print_exc()

举个例子:

try:

1/0

except Exception as e:

print(e)

如果我们这样写的话,程序只会报“division by zero”错误,但是我们并不知道是在哪个文件哪个函数哪一行出的错。

下面使用 traceback 模块,官方参考文档:https://docs.python.org/2/library/traceback.html

import traceback

try:

1/0

except Exception as e:

traceback.print_exc()

这样就会帮我们追溯到出错点:

Traceback (most recent call last):

File “E:/PycharmProjects/ProxyPool-master/proxypool/test.py”, line 4, in

1/0

ZeroDivisi: 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+’))返回搜狐,查看更多

责任编辑:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值