python基础28——异常处理
异常处理
1、什么是异常
异常是程序发生错误的信号,程序一旦出错就会抛出异常,程序的运行随即终止
print('start....')
[1,2,3][1000]
print('stop...')
异常处理的三个特征
异常的追踪信息
异常的类型
异常的内容
2、为何处理异常
为了增强程序的健壮性,即便是程序运行过程中出错了,也不要终止程序
而是捕捉异常并处理:将出错信息记录到日志内
3、如何处理异常?
3.1 语法上的错误SyntaxError
处理方式一:必须在程序运行前就改正
if 1>3
print("run...")
3.2 逻辑上的错误
# TypeError:数字类型无法与字符串类型相加
1+’2’
# ValueError:当字符串包含有非数字的值时,无法转成int类型
num=input(">>: ") #输入hello
int(num)
# NameError:引用了一个不存在的名字x
x
# IndexError:索引超出列表的限制
l=['egon','aa']
l[3]
# KeyError:引用了一个不存在的key
dic={'name':'egon'}
dic['age']
# AttributeError:引用的属性不存在
class Foo:
pass
Foo.x
# ZeroDivisionError:除数不能为0
1/0
3.2 针对逻辑上的异常又分成两种处理方式
3.2.1 错误发生的条件是可以预知的,使用if判断来解决
age=input('>>: ').strip() # 输入的只要不是数字就会出错
if age.isdigit():
age=int(age)
if age > 18:
print('猜大了')
elif age < 18:
print('猜大了')
else:
print('猜对了')
else:
print('必须输入数字')
3.2.2 错误发生的条件是无法预知的(这种情况居多)
基本形式:
try:
被检测的代码块
except 异常类型:
检测到异常,就执行这个位置的逻辑
try:
print('start...')
print(x) # 引用了一个不存在的名字,触发异常NameError
print('end...')
except NameError as e: # as语法将异常类型的值赋值给变量e,这样我们通过打印e便可以知道错误的原因
print('异常值为:%s' %e)
print('run other code...')
#执行结果为
start...
异常值为:name 'x' is not defined
run other code...
print('start...')
try:
有可能会抛出异常的代码
子代码1
子代码2
子代码3
except 异常类型1 as e:
pass
except 异常类型2 as e:
pass
...
else:
如果被检测的子代码块没有异常发生,则会执行else的子代码
finally:
无论被检测的子代码块有无异常发生,都会执行finally的子代码
print('end...')
用法一:
print('start...')
try:
print('1111111111')
l=['aaa','bbbb']
l[3] # 抛出异常IndexError,该行代码同级别的后续代码不会运行
print('2222222222')
xxx
print('33333333')
dic={'a':1}
dic['a']
except IndexError as e:
print('异常的信息: ',e)
print('end....')
用法二:
print('start...')
try:
print('1111111111')
l=['aaa','bbbb']
#l[3] # 抛出异常IndexError,该行代码同级别的后续代码不会运行
print('2222222222')
xxx
print('33333333')
dic={'a':1}
dic['a']
except IndexError as e:
print('异常的信息: ',e)
except NameError as e:
print('异常的信息: ',e)
print('end....')
用法三:
print('start...')
try:
print('1111111111')
l = ['aaa', 'bbbb']
l[3] # 抛出异常IndexError,该行代码同级别的后续代码不会运行
print('2222222222')
xxx
print('33333333')
dic = {'a': 1}
dic['aaa']
# except (IndexError, NameError) as e:
# print('异常的信息: ', e)
# except KeyError as e:
# print('字典的key不存在: ', e)
except Exception as e: # 万能异常
print('所有异常都可以匹配的到')
print('end....')
用法四:else不能单独与try配合使用,必须要搭配except
print('start...')
try:
print('1111111111')
print('2222222222')
print('33333333')
except Exception as e: # 万能异常
print('所有异常都可以匹配的到')
else:
print('====>')
print('end....')
用法五:finally可以单独与try配合使用
print('start...')
try:
print('1111111111')
l = ['aaa', 'bbbb']
l[3] # 抛出异常IndexError,该行代码同级别的后续代码不会运行
print('2222222222')
xxx
print('33333333')
dic = {'a': 1}
dic['aaa']
finally: # 不处理异常,无论是否发生异常都会执行finally的子代码
print('====》》》》》应该把被检测代码中回收系统资源的代码放到这里')
print('end....')
在不符合Python解释器的语法或逻辑规则时,是由Python解释器主动触发的各种类型的异常,而对于违反程序员自定制的各类规则,则需要由程序员自己来明确地触发异常,这就用到了raise语句,raise后必须是一个异常的类或者是异常的实例
class Student:
def __init__(self,name,age):
if not isinstance(name,str):
raise TypeError('name must be str')
if not isinstance(age,int):
raise TypeError('age must be int')
self.name=name
self.age=age
stu1=Student(4573,18) # TypeError: name must be str
stu2=Student('egon','18') # TypeError: age must be int
在内置异常不够用的情况下,我们可以通过继承内置的异常类来自定义异常类
class PoolEmptyError(Exception): # 可以通过继承Exception来定义一个全新的异常
def __init__(self,value='The proxy source is exhausted'): # 可以定制初始化方法
super(PoolEmptyError,self).__init__()
self.value=value
def __str__(self): # 可以定义该方法用来定制触发异常时打印异常值的格式
return '< %s >' %self.value
class NetworkIOError(IOError): # 也可以在特定异常的基础上扩展一个相关的异常
pass
raise PoolEmptyError # __main__.PoolEmptyError: < The proxy source is exhausted >
raise NetworkIOError('连接被拒绝') # __main__.NetworkIOError: 连接被拒绝
最后,Python还提供了一个断言语句assert expression,断定表达式expression成立,否则触发异常AssertionError,与raise-if-not的语义相同,如下
age='18'
# 若表达式isinstance(age,int)返回值为False则触发异常AssertionError
assert isinstance(age,int)
# 等同于
if not isinstance(age,int):
raise AssertionError
我们编写一个下载网页内容的功能,网络发生延迟之类的异常是很正常的事,而我们根本无法预知在满足什么条件的情况下才会出现延迟,因而只能用异常处理机制了
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')
原文地址:https://www.cnblogs.com/lucky-cat233/p/12713746.html
- 《笨办法学Python》 第5课手记
- psRobot:植物小RNA分析系统
- 《笨办法学Python》 第3课手记
- NGS基础 - 参考基因组和基因注释文件
- 关于Android PullTorefreshScrollview回到顶部实例
- 《笨办法学Python》 第2课手记
- 《笨办法学Python》 第1课手记
- 《笨办法学Python》 第40课手记
- 很经典的GDB调试命令,包括查看变量,查看内存
- 《笨办法学Python》 第39课手记
- 《笨办法学Python》 第38课手记
- 01背包及其变种(物品无限背包、恰好装满背包)
- 《笨办法学Python》 第35课手记
- github pages + Hexo + 域名绑定搭建个人博客增强版
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Httprouter—用go实现的高性能路由器
- Django-python最流行的web框架
- C++ 类的不同构造与三种引用
- C++继承、虚函数、RTTI、友元类、异常处理
- C++基本语法
- 抓包分析TCP三次握手四次挥手全过程,教你观看“多包运动”的正确姿势
- 抓包分析以太网帧和IP数据包,头部那么多东东用来干啥的,扫盲篇
- 一文洞悉 OSI和TCP/IP模型,理通所有协议,再也不用似懂非懂了
- 图解https演变以及各种加密解密过程一篇就够!(通俗易懂白话文)
- vs code 创建vue模版
- WebAssembly如何演进成为“浏览器第二编程语言”?
- SAP ABAP和Java的动态代理实现
- SAP ABAP CGLIB(Code Generation Library)的模拟实现
- 如何监听SAP CRM BOR事件
- 如何避免SAP订单保存后生成的中间件CSA inbound queue