week5 day5 异常处理

# 这是我们第一次使用捕捉异常的情况:
res=(i for i in range(4))
while True:
	try:
		next(res)
	except StopIteration:
		print('取干净了')
		break

一、什么是异常?

异常是错误发生的信号。程序一旦出错就会产生一个异常。如果该异常没有被处理,该异常就会被抛出,程序的运行也会随之停止。

错误分为两种:语法错误和逻辑错误。语法错误必须要避免,逻辑错误因为是人类的逻辑,有可能会有漏洞,对于可以直接修改的逻辑错误可以通过加一个判定的方法来避免这个逻辑错误。对于不好直接修改的错误则可以通过异常捕捉机制来避免程序停止运行的情况。
在这里插入图片描述
pycharm中的异常信息主要包含三部分,第一部分是追踪信息,可以点击蓝色位置跳转到出错的地方;第二部分是异常类型,常见的错误类型可以见下表;第三部分是异常信息。异常类型和异常信息都可以自定义,我们将在第三部分进行详细讲解。

  • AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
  • IOError 输入/输出异常;基本上是无法打开文件
  • ImportError 无法引入模块或包;基本上是路径问题或名称错误
  • IndentationError 语法错误(的子类) ;代码没有正确对齐
  • IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
  • KeyError 试图访问字典里不存在的键
  • KeyboardInterrupt Ctrl+C被按下
  • NameError 使用一个还未被赋予对象的变量
  • SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
  • TypeError 传入对象类型与要求的不符合
  • UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
  • ValueError 传入一个调用者不期望的值,即使值的类型是正确的

二、如何处理异常?

监测异常的具体语法:

try:
	被检测代码块
except 异常类型1:
	针对异常类型1的解决方法
except 异常类型2:
	针对异常类型2的解决方案
except Exception: # 如果不论什么异常解决方案都固定,则可以只保留这部分
	针对其他异常类型的解决方案
else: # 不能只有try和else,语法错误
	当被监测代码块没有出现异常执行的代码
finally:
	无论被监测代码有没有出现异常都会执行的操作,一般是回收系统资源的操作
# 例子
list1=[1,2,3,4,5]
index=input('请输入您想取元素的位置:').strip()
try:
	res=list1[int(index)]
	print(res)
except IndexError:
	print('抱歉,您输入想索引元素的位置超出了列表的长度')
except ValueError:
    print('抱歉,请输入数字!')

如果我们想捕获所有异常并用一种处理逻辑,python提供了一个万能异常类型Exception:

try:
	尝试运行代码块
except Exception:
	针对所有异常的处理方式

抛出异常(主动)的例子:

# 例一
l=[11,22]
if len(l)==3:
	print(123)
else:
	raise Exception('抱歉列表中元素不足三个')

三、异常其他

  1. 断言 (测试程序的时候使用)
    l=[11,22]
    assert len(l)==3 # 如果声明的内容成立,assert语句当作不存在。但如果assert的内容不满足,会抛出AssertionError
    
  2. 抛出异常
    raise 异常的的类型或者自定义异常的类型
    
  3. 自定义异常(通过BaseException)
    class Permission(BaseException):
    	def __str__(self):
    		return '抱歉,您没有获得许可批准!'
    raise Permission
    

四、何时使用异常处理

在了解了异常处理机制后,本着提高程序容错率和可靠性的目的,读者可能会错误的认为应该尽可能多地为程序加上try...except...,这其实在过度消费程序的可读性,因为异常捕捉机制本身就是你附加给程序地一种额外的逻辑,与你的主要工作是没有多大关系的。

​如果错误发生的条件是“可预知的”,我们应该用if来进行”预防”,如下

age=input('input your age>>: ').strip()
if age.isdigit(): # 可预知只有满足字符串age是数字的条件,int(age)才不会触发异常,
    age=int(age)
else:
    print('You must enter the number')

如果错误发生的条件“不可预知”,即异常一定会触发,那么我们才应该使用try...except语句来处理。例如我们编写一个下载网页内容的功能,网络发生延迟之类的异常是很正常的事,而我们根本无法预知在满足什么条件的情况下才会出现延迟,因而只能用异常处理机制了。

import requests
from requests.exceptions import ConnectTimeout # 导入requests模块内自定义的异常

def get(url):
    try:
        response=requests.get(url,timeout=3)#超过3秒未下载成功则触发ConnectTimeout异常
        res=response.text
    except ConnectTimeout:
        print('连接请求超时')
        res=None
    except Exception:
        print('网络出现其他异常')
        res=None
    return res

get('https://www.python.org')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值