介绍一下python的异常处理机制,python处理异常的4种方式
调试Python程序时,经常会报告一些异常。一方面,异常的原因可能是由于疏忽或编写程序时考虑不全面而导致的错误。这时,有必要将异常追溯到错误点,并进行分析和纠正。另一方面,有些异常是不可避免的,但是我们可以捕捉它们以防止程序终止。
一、Python内置的异常Python的异常处理能力非常强大。它有许多内置的异常,可以准确地向用户反馈错误信息。
在Python中,异常也是对象,你可以对它们进行操作。BaseException是所有内置异常的基类,但用户定义的类不直接继承BaseException。所有异常类都继承自exception,并在异常模块中定义。
Python自动将所有异常名放入内置名称空间,因此程序可以使用异常而无需导入异常模块。一旦抛出SystemExit异常而未被捕获,程序执行将被终止。
例如,如果交互式会话遇到未捕获的SystemExit异常,会话将被终止。
内置异常类的层次结构如下:
BaseException #所有异常的基类
- SystemExit #解释器请求退出。
- KeyboardInterrupt #用户中断执行(通常输入C)
- GeneratorExit #生成器(generator)有异常通知退出。
- Exception #常规异常的基类
- StopIteration #迭代器没有更多值。
- StopAsyncIteration #必须通过异步迭代器对象的__anext__()方法引发才能停止迭代。
- ArithmeticError #由各种算术错误引发的内置异常的基类
-floating pointer error #浮点计算错误
-溢出错误#数值运算的结果太大,无法表示。
-zerodivisionerror #除(或模)零(所有数据类型)
- AssertionError #当assert语句失败时抛出。
- AttributeError #属性引用或赋值失败。
- BufferError #在无法执行与buffer相关的操作时抛出。
- EOFError #当input()函数到达文件条件结尾(EOF)而没有读取任何数据时引发。
- ImportError #无法导入模块/对象
-modulenotfounderror #找不到模块或在sys.modules中找不到模块
- LookupError #映射或序列上使用的键或索引无效时引发的异常的基类。
-索引(index)在索引错误#序列中不存在。
-keyerror #该键不在映射中。
- MemoryError #内存溢出错误(对Python解释器来说不是致命的)
- NameError #未声明/初始化的对象(无属性)
-unboundlocalrerror #访问未初始化的局部变量
- OSError # OSError,EnvironmentError,IOError,WindowsError,socket.error,select.error和mmap.error已经合并到OSError中,构造函数可能会返回一个子类。
-阻塞io错误# operation将阻塞对象(如套接字)设置为非阻塞操作。
-子进程上的childprocesserror #操作失败。
-connectionerror #与连接相关的异常的基类。
-brokenpiperror #尝试在另一端关闭时写入管道,或者尝试写入具有关闭写入的套接字。
-ConnectionBottedError #连接尝试被对等方中止。
-connectionrefusederror #连接尝试被对等方拒绝。
-ConnectionReset错误#连接被对等方重置。
-fileexists错误#创建一个现有的文件或目录。
-找不到文件错误#请求不存在的文件或目录。
-中断错误#系统调用被输入信号中断。
-isadirectoryerror #请求对目录进行文件操作(例如,os.remove())
-notdirectoryerror #请求对非目录的内容进行目录操作(例如,os.listdir())
-permissionerror #试图在没有足够访问权限的情况下运行操作
-processlookuperror #给定的进程不存在。
-TimeOutError #系统功能在系统级别超时
由- ReferenceError # weakref.proxy()函数创建的弱引用试图访问已被垃圾回收的对象。
- RuntimeError #当检测到不属于任何其他类别的错误时触发
-NotImplementedError #在用户定义的基类中,抽象方法要求派生类重写该方法或者正在开发的类指示仍需要添加实际实现。
-递归错误#解释器检测到超出了最大递归深度。
-语法错误# Python语法错误
-IndentationError #缩进错误
-制表符错误#制表符与空格混合
-系统错误#解释器发现一个内部错误
- TypeError #操作或函数应用于不适当类型的对象。
- ValueError #操作或函数收到类型正确但值不合适的参数。
-Unicode错误#出现与Unicode相关的编码或解码错误。
-Unicode decoder error # Unicode解码错误
-Unicode encoded error # Unicode编码错误
-Unicode translate error # Unicode代码转换错误
- Warning #警告的基类。
- DeprecationWarning #不推荐使用的功能的警告的基类。
- PendingDeprecationWarning #不推荐使用的功能的警告的基类。
- RuntimeWarning #可疑运行时行为警告的基类
- SyntaxWarning #可疑语法警告的基类
- UserWarning #生成警告的用户代码的基类
- FutureWarning #关于不推荐使用的功能的警告的基类。
- ImportWarning #关于模块导入中可能出现的错误的警告的基类。
-Unicode warning # Unicode相关警告的基类
- bytesWarning #与bytes和bytearray相关的警告的基类
- ResourceWarning #与资源使用相关的警告的基类。被默认警告过滤器忽略。二。requests模块的相关异常调用requests模块的内置异常,只需“从requests.exceptions导入XXX”,例如:
来自请求。异常导入连接错误、读取超时或只是这也是可能的:
从请求导入连接错误,readtimeoutrequests模块具有以下内置异常类层次结构:
输出异常
- RequestException #处理不确定的异常请求。
- HTTPError # HTTP错误
- ConnectionError #连接错误
-代理错误#代理错误
-sslerror # SSL错误
-连接超时(-timeout) #(双重继承,下同)尝试连接远程服务器时请求超时。可以安全地重试导致此错误的请求。
-超时#请求超时
-readtimeout #服务器在指定的时间内没有发送任何数据。
- URLRequired #发出请求需要有效的URL。
-太多重定向#重定向太多
- MissingSchema( - ValueError) #缺少URL架构(例如,http或https)
- InvalidSchema( - ValueError) #无效的架构。请参见defaults.py了解有效的模式。
- InvalidURL( - ValueError) #无效的URL
-invalidproxyrl #无效的代理url
- InvalidHeader( - ValueError) #无效标头
- ChunkedEncodingError #服务器声明了分块编码,但发送了无效的块。
-ContentCodeDingError(-BaseHttpError)#无法解码响应内容
-StreamConsequenceError(-type error)#此响应的内容已被使用。
- RetryError #自定义重试逻辑失败。
-unrevandablebodyerror #请求在尝试回退文本时遇到错误。
-FileMode Warning(-折旧警告)#文件以文本模式打开,但其二进制长度由请求决定。
- RequestsDependencyWarning #导入的依赖项与预期的版本范围不匹配。
警告
- requestsWarning #请求的基本警告下面是一个简单的小例子。python内置了一个ConnectionError异常,因此您不必从请求模块导入:
导入请求
从请求导入读取超时
def get_page(url):
尝试:
response=requests.get(url,timeout=1)
如果响应.状态_代码==200:
返回响应。文本
否则:
打印(“获取页面失败”,response.status_code)
不返回
除外(ConnectionError,ReadTimeout):
打印(“爬网失败”,url)
不返回
def main():
url=https://www.baidu.com
print(get_page(url))
if __name__==__main__ :
主()三。用户定义的异常。此外,您还可以通过创建新的异常类来拥有自己的异常。异常应该直接或间接地从异常类继承。下面创建一个MyError类,基类是Exception,用来在触发异常时输出更多信息。
在try语句块中,将引发用户定义的异常,并执行except部分。变量E用于创建MyError类的实例。
类MyError(异常):
def __init__(self,msg):
self.msg=msg
def __str__(self):
返回self.msg
尝试:
引发我的错误(“错误类型”)
除了我的错误为e:
print中“e”的功能(“发生了我的异常”,e.msg)除了作为e:
e是异常类的一个例子。如果完整的解释这个问题,我觉得还是从Python的自定义异常类开始比较好。
假设我们现在定制了一个简单的异常类:class MyError(Exception):
def __init__(self,value):
自我价值=价值
def __str__(self):
Return repr(self.value)当我们抛出这个异常时,我们可以这样写:try:
升高我的误差(2*2)
除了我的错误为e:
Print 我的异常发生,值:,e. value如果我们在捕捉到这个异常后需要访问TA的一些属性怎么办?这时,我们可以使用as关键字。
所以这里的e是前面MyError异常类的一个例子,我们可以直接访问它的值,也就是你看到的e.value。四。异常捕获。当异常发生时,我们需要捕捉异常,然后相应地处理它。Python的异常捕获通常使用try…except…结构,该结构将可能有错误的语句放在try模块中,并用except处理异常。每个尝试必须对应至少一个,除了。此外,与python异常相关的关键字主要包括:
关键字
关键词描述
尝试/例外
捕捉和处理异常。
及格
忽略异常
如同
定义异常实例(除了MyError为e)
其他
如果try中的语句没有引发异常,则执行else中的语句。
最后
不管异常是否发生都执行的代码。
上升
抛出/抛出异常
1.捕捉所有异常。
包括键盘中断和程序退出请求(不能用sys.exit()退出程序,因为捕捉到了异常),慎用。
尝试:
句子
除了:
打印(“例外描述”)2。捕捉指定的异常
尝试:
句子
例外名称除外:
打印(“异常描述”)3。捕捉通用异常:
尝试:
句子
例外情况除外:
打印(“异常描述”)例如:
尝试:
f=打开(文件不存在, r )
除了IOError作为e:
print( open exception:% s:% s %(e . errno,e.strerror)) 4。捕捉多个异常
有两种方法可以捕捉多个异常。第一种是one except同时处理多个异常,没有优先级:
尝试:
句子
Except(异常名1,异常名2,):
打印(“异常描述”)第二个优先:
尝试:
句子
例外名称1除外:
打印(“例外描述1”)
例外名称2除外:
打印(“例外描述2”)
例外名称3除外:
Print(异常描述3 )此异常处理语法的规则如下:
执行try下的语句。如果抛出异常,执行将跳转到第一个except语句。
如果第一个except中定义的异常与引发的异常匹配,则执行except中的语句。
如果抛出的异常与第一个except不匹配,将搜索第二个except,并且允许编写的异常数量没有限制。
如果除之外的所有代码都不匹配,该异常将被传递给调用此代码的下一个最高级别的try代码。
5.其他例外情况
如果判断没有异常后还想做别的,可以使用下面的else语句。
尝试:
句子
例外名称1除外:
打印(“例外描述1”)
例外名称2除外:
打印(“例外描述2”)
否则:
如果语句# try语句中没有异常,则执行这段代码。6.终于出现了例外
Try…finally…语句将执行最后一段代码,而不管是否出现异常。
尝试:
句子
最后:
句子
看一个例子:
str1=hello world
尝试:
int(str1)
除了e:
打印(e)
除了KeyError作为e:
打印(e)
除了值错误为e:
打印(e)
否则:
打印( try中没有异常)
最后:
Print(无论异常与否我都会被执行)7.raise主动触发异常。
您可以使用raise语句自己触发异常,raise语法格式如下:
raise [exception [,args [,traceback]]语句中的异常为异常类型(例如ValueError),参数为异常参数值。该参数是可选的。如果未提供,则异常参数为“无”。最后一个参数是跟踪异常对象,这也是可选的(实践中很少使用)。
例如:
def not_zero(数字):
尝试:
如果num==0:
引发ValueError(“参数错误”)
退货数量
例外情况为e:
打印(e)
Not_zero(0) 5当异常发生时,使用回溯模块查看异常,Python可以“记住”引发的异常和程序的当前状态。Python还维护一个traceback对象,该对象包含异常发生时关于函数调用堆栈的信息。记住,异常可能在一系列深度嵌套的函数调用中抛出。当程序调用每个函数时,Python会在“函数调用栈”的开头插入函数名。一旦抛出异常,Python就会搜索相应的异常处理程序。如果当前函数中没有异常处理程序,则当前函数的执行将被终止。Python会搜索当前函数的调用函数,以此类推,直到找到匹配的异常处理程序或者Python到达主程序。这个寻找合适的异常处理程序的过程被称为“StackUnwinding”。解释器一方面维护着放入堆栈的函数的信息,另一方面也维护着已经从堆栈中“解读”出来的函数的信息。
格式如下:
尝试:
街区
除了:
Traceback.print_exc()例如:
尝试:
1/0
例外情况为e:
Print(e)如果我们这样写,程序只会报告“被零除”错误,但我们不知道错误在哪个文件、函数和行中。
使用下面的追溯模块,官方参考文件:https://docs.python.org/2/library/traceback.html
导入追溯
尝试:
1/0
例外情况为e:
Traceback.print_exc()这将帮助我们追溯到错误点:
回溯(最近一次呼叫):
模块中文件“E:/PycharmProjects/proxy pool-master/proxy pool/test . py”的第4行
1/0
ZeivisionError:除以零另外,traceback.print_exc()和traceback.format_exc()有什么区别?
不同的是format_exc()返回一个字符串,print_exc()直接打印出来。即traceback.print_exc()与print(traceback.format_exc())的效果相同。
Print_exc()也可以接受将文件参数直接写入文件。例如,您可以将相关信息写入tb.txt文件,如下所示。
trace back . print _ exc(file=open( TB . txt , w ))期待陌生,拥抱惊喜。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。