广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python异常及处理方法总结
  • 657
分享到

Python异常及处理方法总结

异常方法Python 2023-01-31 01:01:56 657人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

调试python程序时,经常会报出一些异常,异常的原因一方面可能是写程序时由于疏忽或者考虑不全造成了错误,这时就需要根据异常Traceback到出错点,进行分析改正;另一方面,有些异常是不可避免的,但我们可以对异常进行捕获处理,防止程序终

调试python程序时,经常会报出一些异常,异常的原因一方面可能是写程序时由于疏忽或者考虑不全造成了错误,这时就需要根据异常Traceback到出错点,进行分析改正;另一方面,有些异常是不可避免的,但我们可以对异常进行捕获处理,防止程序终止。

1.1 Python内置异常

Python的异常处理能力是很强大的,它有很多内置异常,可向用户准确反馈出错信息。在Python中,异常也是对象,可对它进行操作。BaseException是所有内置异常的基类,但用户定义的类并不直接继承BaseException,所有的异常类都是从Exception继承,且都在exceptions模块中定义。Python自动将所有异常名称放在内建命名空间中,所以程序不必导入exceptions模块即可使用异常。一旦引发而且没有捕捉SystemExit异常,程序执行就会终止。如果交互式会话遇到一个未被捕捉的SystemExit异常,会话就会终止。

内置异常类的层次结构如下:


BaseException  # 所有异常的基类
 +-- SystemExit  # 解释器请求退出
 +-- KeyboardInterrupt  # 用户中断执行(通常是输入^C)
 +-- GeneratorExit  # 生成器(generator)发生异常来通知退出
 +-- Exception  # 常规异常的基类
      +-- StopIteration  # 迭代器没有更多的值
      +-- StopAsyncIteration  # 必须通过异步迭代器对象的__anext__()方法引发以停止迭代
      +-- ArithmeticError  # 各种算术错误引发的内置异常的基类
      |    +-- FloatingPointError  # 浮点计算错误
      |    +-- OverflowError  # 数值运算结果太大无法表示
      |    +-- ZeroDivisionError  # 除(或取模)零 (所有数据类型)
      +-- AssertionError  # 当assert语句失败时引发
      +-- AttributeError  # 属性引用或赋值失败
      +-- BufferError  # 无法执行与缓冲区相关的操作时引发
      +-- EOFError  # 当input()函数在没有读取任何数据的情况下达到文件结束条件(EOF)时引发
      +-- ImportError  # 导入模块/对象失败
      |    +-- ModuleNotFoundError  # 无法找到模块或在在sys.modules中找到None
      +-- LookupError  # 映射或序列上使用的键或索引无效时引发的异常的基类
      |    +-- IndexError  # 序列中没有此索引(index)
      |    +-- KeyError  # 映射中没有这个键
      +-- MemoryError  # 内存溢出错误(对于Python 解释器不是致命的)
      +-- NameError  # 未声明/初始化对象 (没有属性)
      |    +-- UnboundLocalError  # 访问未初始化的本地变量
      +-- OSError  # 操作系统错误,EnvironmentError,IOError,windowsError,Socket.error,select.error和mmap.error已合并到OSError中,构造函数可能返回子类
      |    +-- BlockingIOError  # 操作将阻塞对象(e.g. socket)设置为非阻塞操作
      |    +-- ChildProcessError  # 在子进程上的操作失败
      |    +-- ConnectionError  # 与连接相关的异常的基类
      |    |    +-- BrokenPipeError  # 另一端关闭时尝试写入管道或试图在已关闭写入的套接字上写入
      |    |    +-- ConnectionAbortedError  # 连接尝试被对等方中止
      |    |    +-- ConnectionRefusedError  # 连接尝试被对等方拒绝
      |    |    +-- ConnectionResetError    # 连接由对等方重置
      |    +-- FileExistsError  # 创建已存在的文件或目录
      |    +-- FileNotFoundError  # 请求不存在的文件或目录
      |    +-- InterruptedError  # 系统调用被输入信号中断
      |    +-- IsADirectoryError  # 在目录上请求文件操作(例如 os.remove())
      |    +-- NotADirectoryError  # 在不是目录的事物上请求目录操作(例如 os.listdir())
      |    +-- PermissionError  # 尝试在没有足够访问权限的情况下运行操作
      |    +-- ProcessLookupError  # 给定进程不存在
      |    +-- TimeoutError  # 系统函数在系统级别超时
      +-- ReferenceError  # weakref.proxy()函数创建的弱引用试图访问已经垃圾回收了的对象
      +-- RuntimeError  # 在检测到不属于任何其他类别的错误时触发
      |    +-- NotImplementedError  # 在用户定义的基类中,抽象方法要求派生类重写该方法或者正在开发的类指示仍然需要添加实际实现
      |    +-- RecursionError  # 解释器检测到超出最大递归深度
      +-- SyntaxError  # Python 语法错误
      |    +-- IndentationError  # 缩进错误
      |         +-- TabError  # Tab和空格混用
      +-- SystemError  # 解释器发现内部错误
      +-- TypeError  # 操作或函数应用于不适当类型的对象
      +-- ValueError  # 操作或函数接收到具有正确类型但值不合适的参数
      |    +-- UnicodeError  # 发生与Unicode相关的编码或解码错误
      |         +-- UnicodeDecodeError  # Unicode解码错误
      |         +-- UnicodeEncodeError  # Unicode编码错误
      |         +-- UnicodeTranslateError  # Unicode转码错误
      +-- Warning  # 警告的基类
           +-- DeprecationWarning  # 有关已弃用功能的警告的基类
           +-- PendingDeprecationWarning  # 有关不推荐使用功能的警告的基类
           +-- RuntimeWarning  # 有关可疑的运行时行为的警告的基类
           +-- SyntaxWarning  # 关于可疑语法警告的基类
           +-- UserWarning  # 用户代码生成警告的基类
           +-- FutureWarning  # 有关已弃用功能的警告的基类
           +-- ImportWarning  # 关于模块导入时可能出错的警告的基类
           +-- UnicodeWarning  # 与Unicode相关的警告的基类
           +-- BytesWarning  # 与bytes和bytearray相关的警告的基类
           +-- ResourceWarning  # 与资源使用相关的警告的基类。被默认警告过滤器忽略。

详细说明请参考:https://docs.python.org/3/library/exceptions.html#base-classes

1.2 requests模块的相关异常

在做爬虫时,requests是一个十分好用的模块,所以我们在这里专门探讨一下requests模块相关的异常。

要调用requests模块的内置异常,只要“from requests.exceptions import xxx”就可以了,比如:


from requests.exceptions import ConnectionError, ReadTimeout

或者直接这样也是可以的:


from requests import ConnectionError, ReadTimeout

requests模块内置异常类的层次结构如下:


IOError
 +-- RequestException  # 处理不确定的异常请求
      +-- HttpError  # HTTP错误
      +-- ConnectionError  # 连接错误
      |    +-- ProxyError  # 代理错误
      |    +-- SSLError  # SSL错误
      |    +-- ConnectTimeout(+-- Timeout)  # (双重继承,下同)尝试连接到远程服务器时请求超时,产生此错误的请求可以安全地重试。
      +-- Timeout  # 请求超时
      |    +-- ReadTimeout  # 服务器未在指定的时间内发送任何数据
      +-- URLRequired  # 发出请求需要有效的URL
      +-- TooManyRedirects  # 重定向太多
      +-- MissingSchema(+-- ValueError) # 缺少URL架构(例如http或https)
      +-- InvalidSchema(+-- ValueError) # 无效的架构,有效架构请参见defaults.py
      +-- InvalidURL(+-- ValueError)  # 无效的URL
      |    +-- InvalidProxyURL  # 无效的代理URL
      +-- InvalidHeader(+-- ValueError)  # 无效的Header
      +-- ChunkedEncodingError  # 服务器声明了chunked编码但发送了一个无效的chunk
      +-- ContentDecodingError(+-- BaseHTTPError)  # 无法解码响应内容
      +-- StreamConsumedError(+-- TypeError)  # 此响应的内容已被使用
      +-- RetryError  # 自定义重试逻辑失败
      +-- UnrewindableBodyError  # 尝试倒回正文时,请求遇到错误
      +-- FileModeWarning(+-- DeprecationWarning)  # 文件以文本模式打开,但Requests确定其二进制长度
      +-- RequestsDependencyWarning  # 导入的依赖项与预期的版本范围不匹配

Warning
 +-- RequestsWarning  # 请求的基本警告

详细说明及源码请参考:http://www.python-requests.org/en/master/_modules/requests/exceptions/#RequestException

下面是一个简单的小例子,python内置了一个ConnectionError异常,这里可以不用再从requests模块import了:


import requests
from requests import ReadTimeout


def get_page(url):
	try:
		response = requests.get(url, timeout=1)
		if response.status_code == 200:
			return response.text
		else:
			print('Get Page Failed', response.status_code)
			return None
	except (ConnectionError, ReadTimeout):
		print('Crawling Failed', url)
		return None


def main():
	url = 'https://www.baidu.com'
	print(get_page(url))


if __name__ == '__main__':
	main()

1.3 用户自定义异常

此外,你也可以通过创建一个新的异常类拥有自己的异常,异常应该是通过直接或间接的方式继承自Exception类。下面创建了一个MyError类,基类为Exception,用于在异常触发时输出更多的信息。

  在try语句块中,抛出用户自定义的异常后执行except部分,变量 e 是用于创建MyError类的实例。


class MyError(Exception):
	def __init__(self, msg):
		self.msg = msg
	
	def __str__(self):
		return self.msg


try:
	raise MyError('类型错误')
except MyError as e:
	print('My exception occurred', e.msg)

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

关键字 关键字说明
try/except 捕获异常并处理
pass 忽略异常
as 定义异常实例(except MyError as e)
else 如果try中的语句没有引发异常,则执行else中的语句
finally 无论是否出现异常,都执行的代码
raise     抛出/引发异常

异常捕获有很多方式,下面分别进行讨论。

2.1 捕获所有异常

包括键盘中断和程序退出请求(用sys.exit()就无法退出程序了,因为异常被捕获了),因此慎用。


try:
     <语句>

except:

      print('异常说明')

 

2.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))

2.3 捕获多个异常

捕获多个异常有两种方式,第一种是一个except同时处理多个异常,不区分优先级:


try:
     <语句>

except (<异常名1>, <异常名2>, ...):

      print('异常说明')

第二种是区分优先级的:


try:
     <语句>

except <异常名1>:

      print('异常说明1')

except <异常名2>:

      print('异常说明2')

except <异常名3>:

      print('异常说明3')

该种异常处理语法的规则是:

  • 执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句。
  • 如果第一个except中定义的异常与引发的异常匹配,则执行该except中的语句。
  • 如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except数量没有限制。
  • 如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。

2.4 异常中的else

如果判断完没有某些异常之后还想做其他事,就可以使用下面这样的else语句。


try:
     <语句>

except <异常名1>:

      print('异常说明1')

except <异常名2>:

      print('异常说明2')

else:

      <语句>  # try语句中没有异常则执行此段代码

2.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('无论异常与否,都会执行我')

2.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)

2.7 采用traceback模块查看异常

发生异常时,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 <module>
    1/0
ZeroDivisionError: 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+'))

参考博文:

except as e中的‘e’的作用总结

python使用traceback获取详细的异常信息

 

--结束END--

本文标题: Python异常及处理方法总结

本文链接: https://www.lsjlt.com/news/184196.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python异常及处理方法总结
    调试Python程序时,经常会报出一些异常,异常的原因一方面可能是写程序时由于疏忽或者考虑不全造成了错误,这时就需要根据异常Traceback到出错点,进行分析改正;另一方面,有些异常是不可避免的,但我们可以对异常进行捕获处理,防止程序终...
    99+
    2023-01-31
    异常 方法 Python
  • 常见的Python异常及处理方法总结
    目录一、错误与异常1.什么是错误2.什么是异常3.回溯信息二、常见异常常见异常类三.异常处理1.异常处理2.简单的异常处理格式3.执行顺序4.except分支可以有多个5.执行顺序6...
    99+
    2022-11-12
  • Java常见异常及处理方式总结
    目录一、概述二、异常分类三、声明及抛出四、捕获异常五、捕获多个异常六、自定义异常七、异常堆栈一、概述 异常指不期而至的各种状况,它在程序运行的过程中发生。作为开发者,我们都希望自己写...
    99+
    2022-11-12
  • python 异常处理总结
    最近,做个小项目经常会遇到Python 的异常,让人非常头疼,故对异常进行整理,避免下次遇到异常不知所措,以下就是对Python 异常进行的整理。 1.Python异常类 ...
    99+
    2022-06-04
    异常 python
  • Python常见异常处理总结
    目录异常处理介绍语法报错异常处理解决方法抛出异常自定义异常其他内置函数总结异常处理介绍 在实际的开发中,我们经常遇到一些报错的例子,在pycharm的显示页面下,当我们看到一串串的红...
    99+
    2022-11-11
  • Python异常类型以及处理方法汇总
    目录前言1 异常类型1.1 Python内置异常1.2 requests模块的相关异常1.3 用户自定义异常2. 异常捕获2.1 捕获所有异常2.2 捕...
    99+
    2022-11-12
  • Python中异常捕获与处理的方法总结
    Python异常是在程序执行时发生的错误,可能会导致程序终止运行。 在Python中,异常处理是一种机制,它允许开发人员在程序发生异常时捕获、处理和报告这些异常,以便程序可以继续运行...
    99+
    2023-05-18
    Python异常捕获 Python异常处理 Python异常
  • Java异常(Exception)处理以及常见异常总结
    目录前言异常简介 异常类型 总结前言 很多事件并非总是按照人们自己设计意愿顺利发展的,经常出现这样那样的异常情况。例如: 你计划周末郊游,计划从家里出发→到达目的→游泳→烧烤→回家。...
    99+
    2022-11-12
  • Python基础异常处理梳理总结
    目录前言一、常见的Python异常AssertionError:断言语句(assert)失败AttributeError:尝试访问未知的对象属性IndexError:索引超出序列的范...
    99+
    2022-11-11
  • SpringBoot实现全局异常处理方法总结
    目录全局异常处理配置全局异常全局异常处理的升级加入自定义异常处理处理 Controller 数据绑定、数据校验的异常GlobalExceptionHandler全部代码总结在项目开发...
    99+
    2022-11-13
  • 总结C#处理异常的方式
    关于异常,从我们一开始写代码的时候就开始伴随着我们,只不过那时还没入门,脑子里并没有产生意识这就是异常。 异常:程序运行期间发生错误, 异常对象: 将程序发生的各种错误封装成对象 ...
    99+
    2022-11-12
  • python中异常报错处理方法汇总
    首先异常是什么,异常白话解释就是不正常,程序里面一般是指程序员输入的格式不规范,或者需求的参数类型不对应,不全等等。 Python中异常是指程序中的例外,违例情况。异常机制是指程序出现错误后,程序的处理方法...
    99+
    2022-06-04
    报错 异常 方法
  • C#各种异常处理方式总结
    .NET的异常处理机制用来发现、处理运行时错误。如果开发人员没有提供异常的处理机制,就默认采用.NET的机制。 通常使用try...catch...finally捕获异常。 try ...
    99+
    2022-11-13
  • Java异常处理方法汇总
    目录一、异常是什么 二、异常类型 三、常见异常 四、常用异常方法 五、异常处理 六、关键字 throws/throw 七、自定义异常 前言: 我们在软件开发的过程中,任何语言的开发过...
    99+
    2022-11-12
  • Python打包exe时各种异常处理方案总结
    异常: You are using pip version 10.0.1, however version 21.1.1 is available. You should con...
    99+
    2022-11-12
  • Python学习笔记总结(四):异常处理
    一、异常基础 1、基础 try/except/else:【else是可选的】捕捉由代码中的异常并恢复,匹配except里面的错误,并执行except中定义的代码,后继续执行程序(发生异常后,由except捕捉到异常后,不...
    99+
    2023-01-31
    学习笔记 异常 Python
  • 关于python常见异常以及处理方法
    一、常见的异常 1、NameError 未定义变量异常 print(a) # 输出:NameError: name 'a' is not defined 2、IndexError 下...
    99+
    2023-05-16
    python常见异常 python异常处理
  • Java.lang.NumberFormatException 异常及处理方法
    Java.lang.NumberFormatException 异常及处理方法 引言: 在Java编程中,我们常常遇到各种异常情况。其中之一是 java.lang.NumberFormatExcept...
    99+
    2023-10-28
    java python 开发语言 Java
  • 总结php处理数组常用方法
    PHP是一种流行的编程语言,适用于Web开发。 在Web开发中,经常需要操作数组,因此了解如何在PHP中处理数组是必不可少的。在本文中,我们将介绍PHP中一些常用的数组处理方法。创建数组在PHP中,可以通过以下方式来创建一个数组:$arra...
    99+
    2023-05-14
  • Python异常处理中容易犯得错误总结
    目录Python异常处理机制容易犯的错误1容易犯的错误2总结Python异常处理机制 如果try异常处理中存在finally,finally中的代码总会得到执行 下面例子只是作为演示,不用去纠结业务逻辑 容易犯的错...
    99+
    2022-06-02
    python 异常处理 python 异常处理错误
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作