Python的异常检测:try-except

Python中检测处理异常是非常重要的,这可以增加代码的健壮性,我们在写python程序的时候,会可能会遇到一些不可预料的情况,一旦遇到这些情况,运行时程序便可能会崩溃。

比如:读写文件时候文件打开错误或者文件写入错误,写爬虫时网络请求失败,返回错误404.再或者函数处理一些不确定参数时候,都可以用到异常捕获。

异常可以通过 try 语句来检测. 任何在 try 语句块里的代码都会被监测, 检查有无异常发生。

try 语句有两种主要形式: try-except 和 try-finally . 这两个语句是互斥的, 也就是说你只能使用其中的一种 . 一个 try 语句可以对应一个或多个 except 子句 , 但只能对应一个finally 子句, 或是一个 try-except-finally 复合语句.

1、try-except 语句
最常见的 try-except 语句语法如下所示,它由try块和except块 (try_suite 和 except_suite )组成, 也可以有一个可选的错误原因。首先尝试执行 try 子句, 如果没有错误, 忽略所有的 except 从句继续执行,如果发生异常, 解释器将在这一串处理器(except 子句)中查找匹配的异常。

try:
	try_suite  #监控这里的异常
except Exception[, reason]:
	except_suite  #处理异常的代码

简单用法(except后面不跟特定异常,这会捕获所有异常)这种好处就是你不知道会发生什么异常,尽管用;坏处就是当异常发生时候,不能清楚了解到底发生哪种异常。

import requests

try:
	html = requests.get('https://www.x.com')
	print("连接成功")
exceptprint"连接失败"print("继续执行")

虽然连接没有成功,但程序是正常运行的,会继续往下运行。如果没有try,程序则会中断报错。我们发现第一个print并没有运行,这是因为try 语句块中异常发生点后的剩余语句永远不会到达(所以也永远不会执行)。
下面这个是捕获特定异常的,其他异常不会被捕获:

try:
	f = open('book','r')
except IOError, e:
	print('could not open file:', e)

2、带有多个 except 的 try 语句
可以把多个 except 语句连接在一起, 处理一个 try 块中可能发生的多种异常, 如下所示::

首先尝试执行 try 子句, 如果没有错误, 忽略所有的 except 从句继续执行. 如果发生异常, 解释器将在这一串处理器(except子句)中查找匹配的异常,如果找到对应的处理器, 执行流将跳转到这里。示例代码:

def safe_float(obj):
	try:
		retval = float(obj)
	except ValueError:
		retval = '不能将非数值类型转换为float'
	except TypeError:
		retval = 'object type不能转换为float'
	print(retval)
	return retval
safe_float('')
safe_float(())
safe_float(454)

运行结果:
不能将非数值类型转换为float
object type不能转换为float
454.0

3、处理多个异常的 except 语句
我们还可以在一个 except 子句里处理多个异常. 上边展示了如何同时处理两个异常. 事实上 except 语句可以处理任意多个异常,前提只是它们被放入一个元组里 , 如下所示:示例代码:

def safe_float(obj):
	try:
		retval = float(obj)
	except (ValueError, TypeError):
		retval = "参数必须是数字或者可数字化的字符串"
	print(retval)
	return retval
safe_float('dsfsdfg')
safe_float('25.36')
safe_float(454)

运行结果:
参数必须是数字或者可数字化的字符串
25.36
454.0

4、捕获所有异常
刚开始我讲过一个捕获所有异常的方法,不过这种方法不推荐使用,原因我上面说过,我们无法得知捕获的异常是什么。

try:
	:
except:
	...

我们可以用下面这种:

try:
	:
except Exception as e:
	...

示例:

def safe_float(obj):
	try:
		retval = float(obj)
	except Exception as e:
		retval = "不能将非数值类型转换为float"
	print(retval)
	return retval

关于捕获所有异常, 你应当知道有些异常不是由于错误条件引起的. 它们是 SystemExit 和KeyboardInterupt 。 SystemExit 是由于当前 Python 应用程序需要退出, KeyboardInterupt 代表用户按下了 CTRL-C (^C) , 想要关闭 Python .。在真正需要的时候, 这些异常却会被异常处理捕获,一个典型的迂回工作法代码框架可能会是这样:

try:
	:
except (KeyboardInterupt, SystemExit):
	# user wants to quit
	raise # reraise back to caller
except Exception:
	# handle real errors

总结:核心风格: 不要处理并忽略所有错误

Python 提供给程序员的 try-except 语句是为了更好地跟踪潜在的错误并在代码里准备好处理异常的逻辑. 这样的机制在其他语言(例如 C ) 是很难实现的. 它的目的是减少程序出错的次数并在出错后仍能保证程序正常执行. 作为一种工具而言, 只有正确得当地使用它,才能使其发挥作用。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值