Python同时处理多个异常的方法

问题

你有一个代码片段可能会抛出多个不同的异常,怎样才能不创建大量重复代码就能处理所有的可能异常呢?

解决方案

如果你可以用单个代码块处理不同的异常,可以将它们放入一个元组中,如下所示:

try:
  client_obj.get_url(url)
except (URLError, ValueError, SocketTimeout):
  client_obj.remove_url(url)

在这个例子中,元祖中任何一个异常发生时都会执行 remove_url() 方法。 如果你想对其中某个异常进行不同的处理,可以将其放入另外一个 except 语句中:

try:
  client_obj.get_url(url)
except (URLError, ValueError):
  client_obj.remove_url(url)
except SocketTimeout:
  client_obj.handle_url_timeout(url)

很多的异常会有层级关系,对于这种情况,你可能使用它们的一个基类来捕获所有的异常。例如,下面的代码:

try:
  f = open(filename)
except (FileNotFoundError, PermissionError):
  pass

可以被重写为:

try:
  f = open(filename)
except OSError:
  pass

OSError FileNotFoundError PermissionError 异常的基类。

讨论

尽管处理多个异常本身并没什么特殊的,不过你可以使用 as 关键字来获得被抛出异常的引用:

try:
  f = open(filename)
except OSError as e:
  if e.errno == errno.ENOENT:
    logger.error('File not found')
  elif e.errno == errno.EACCES:
    logger.error('Permission denied')
  else:
    logger.error('Unexpected error: %d', e.errno)

这个例子中, e 变量指向一个被抛出的 OSError 异常实例。 这个在你想更进一步分析这个异常的时候会很有用,比如基于某个状态码来处理它。

同时还要注意的时候 except 语句是顺序检查的,第一个匹配的会执行。 你可以很容易的构造多个 except 同时匹配的情形,比如:

>>> f = open('missing')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'missing'
>>> try:
...   f = open('missing')
... except OSError:
...   print('It failed')
... except FileNotFoundError:
...   print('File not found')
...
It failed
>>>

这里的 FileNotFoundError 语句并没有执行的原因是 OSError 更一般,它可匹配 FileNotFoundError 异常, 于是就是第一个匹配的。 在调试的时候,如果你对某个特定异常的类成层级关系不是很确定, 你可以通过查看该异常的 __mro__ 属性来快速浏览。比如:

>>> FileNotFoundError.__mro__
(<class 'FileNotFoundError'>, <class 'OSError'>, <class 'Exception'>,
 <class 'BaseException'>, <class 'object'>)
>>>

上面列表中任何一个直到 BaseException 的类都能被用于 except 语句。

以上就是Python同时处理多个异常的方法的详细内容,更多关于Python处理异常的资料请关注我们其它相关文章!

(0)

相关推荐

  • 通过实例了解Python异常处理机制底层实现

    要了解try except异常处理的用法,简单来说,当位于 try 块中的程序执行出现异常时,会将该种异常捕获,同时找到对应的 except 块处理该异常,那么这里就有一个问题,它是如何找到对应的 except 块的呢? 我们知道,一个 try 块也可以对应多个 except 块,一个 except 块可以同时处理多种异常.如果我们想使用一个 except 块处理所有异常,就可以这样写: try: #...except Exception: #... 这种情况下,对于 try 块中可能出现的任何

  • 新手常见Python错误及异常解决处理方案

    写Python代码的小伙伴不可避免地会遇到代码执行错误和异常,这次就来详细且不失通俗地总结一下python中的错误和异常. 先抛出两个问题: 什么是Python错误和异常? 如何处理Python错误和异常? 1.语法错误可能是初学者最常遇到的,如下面熟悉的画面: SyntaxError: invalid syntax语法错误又称解析错误,又有老哥会问什么是解析错误?简单来说是基本语法结构写错了,如:多任务写成一行.for循环没加':'等.如下: 多任务写成一行 for循环没加':' 上面示例可以

  • Python异常处理例题整理

    什么是异常? 异常是Python对象,表示一个错误.当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行.在程序运行过程中,总会遇到各种各样的错误,有的错误是程序编写有问题造成的 还有一类错误是完全无法在程序运行过程中预测的:一切异常皆是对象 系统定义的异常: BaseException 所有异常的基类,父类 Exception 常规错误的基类 StandardError 所有的内建标准异常的基类,标准化错误 ImportError  导入模块错误 ArithmeticError

  • python except异常处理之后不退出,解决异常继续执行的实现

    写了个等待分析结果,解析分析结果json的脚本 那个文件生成时候有点大,有时候监测到新文件就去解析可能文件只生成了一半,就会抛出异常退出当前线程,此次的分析结果就丢失了,如果load json文件失败,一般就是上百M到几G的json大文件,等待10秒,如果再次load失败,重新再load一次,这样脚本看上去挺繁琐的,监控线程又只能监控文件的创建,修改和删除,不知道创建的文件是否写完毕. def run_analyze(): sleep(2) berror = True temp = {} whi

  • python异常处理之try finally不报错的原因

    因为有把python程序打包成exe的需求,所以,有了如下的代码 import time class LoopOver(Exception): def __init__(self, *args, **kwargs): pass class Spider: def __init__(self): super().__init__() def run(self): raise LoopOver @property def time(self): return '总共用时:{}秒'.format(se

  • Python异常处理机制结构实例解析

    首先,Python 完整的异常处理语法结构如下: try: #业务实现代码 except Exception1 as e: #异常处理块1 ... except Exception2 as e: #异常处理块2 ... #可以有多个 except ... else: #正常处理块 finally : #资源回收块 ... 整个异常处理结构的执行过程,如图 1 所示. 注意,在整个异常处理结构中,只有 try 块是必需的,也就是说: 如果没有 try 块,则不能有后面的 except 块.else

  • python实现数据清洗(缺失值与异常值处理)

    1. 将本地sql文件写入mysql数据库 本文写入的是python数据库的taob表 source [本地文件] 其中总数据为9616行,列分别为title,link,price,comment 2.使用python链接并读取数据 查看数据概括 #-*- coding:utf-8 -*- #author:M10 import numpy as np import pandas as pd import matplotlib.pylab as plt import mysql.connector

  • Python同时处理多个异常的方法

    问题 你有一个代码片段可能会抛出多个不同的异常,怎样才能不创建大量重复代码就能处理所有的可能异常呢? 解决方案 如果你可以用单个代码块处理不同的异常,可以将它们放入一个元组中,如下所示: try: client_obj.get_url(url) except (URLError, ValueError, SocketTimeout): client_obj.remove_url(url) 在这个例子中,元祖中任何一个异常发生时都会执行 remove_url() 方法. 如果你想对其中某个异常进行

  • python traceback捕获并打印异常的方法

    异常处理是日常操作了,但是有时候不能只能打印我们处理的结果,还需要将我们的异常打印出来,这样更直观的显示错误 下面来介绍traceback模块来进行处理 try: 1/0 except Exception, e: print e 输出结果是integer division or modulo by zero,只知道是报了这个错,但是却不知道在哪个文件哪个函数哪一行报的错. 使用traceback try: 1/0 except Exception, e: traceback.print_exc(

  • Python使用try except处理程序异常的三种常用方法分析

    本文实例讲述了Python使用try except处理程序异常的三种常用方法.分享给大家供大家参考,具体如下: 如果你在写python程序时遇到异常后想进行如下处理的话,一般用try来处理异常,假设有下面的一段程序: try: 语句1 语句2 . . 语句N except .........: do something ....... 但是你并不知道"语句1至语句N"在执行会出什么样的异常,但你还要做异常处理,且想把出现的异常打印出来,并不停止程序的运行,所以在"except

  • python装饰器实现对异常代码出现进行自动监控的实现方法

    异常,不应该存在,但是我们有时候会遇到这样的情况,比如我们监控服务器的时候,每一秒去采集一次信息,那么有一秒没有采集到我们想要的信息,但是下一秒采集到了, 而后每次的采集都能采集到,就那么一次采集不到,我们应该针对这一次采集不到进行分析吗,这种的情况可以说无法重复出现,我们也无法避免,因为外界的因素太多太多,我们无法去控制这些外面的因素,所以我们会有这样的需求,一段时间内出现频率多少次,我们才能显示一次报警,或者说,一段时间内出现的频率达到我们的异常许可范围我们认为这样的属于异常,我们可以发出报

  • python上下文管理器异常问题解决方法

    对于异常的使用上,当我们在捕捉到错误时,会有一个抛出的选项让我们做决定.不过加入了上下文管理器后,就不用对异常进行选择了,因为其作用是不必抛出.下面我们就python上下文管理器处理异常进行说明,分析其中的三个参数,最后带来一个处理异常的实例供大家进行学习. 1.异常说明 异常可以在__exit__ 进行捕获并由你自己决定如何处理,是抛出还是不抛出.在__exit__ 里返回 True(没有return 就默认为 return False),就相当于告诉 Python解释器,这个异常我们已经捕获

  • python中异常捕获方法详解

    在Python中处理异常使用的是try-except代码块,try-except代码块放入让python执行的操作,同时告诉python程序如果发生了异常该怎么办,try-except这个功能其实很多入门书籍中都放到了高级篇幅里,在入门的时候一般不会讲这个使用,尤其是作为运维人员,如果你经常写shell,转到python后估计也很少使用这个功能,这功能我觉得说明了shell和python的一个重要区别,因为python是一门真正的编程语言,像其它的编程语言php,java等都会提供异常捕获功能,

  • Python通过select实现异步IO的方法

    本文实例讲述了Python通过select实现异步IO的方法.分享给大家供大家参考.具体如下: 在Python中使用select与poll比起在C中使用简单得多.select函数的参数是3个列表,包含整数文件描述符,或者带有可返回文件描述符的fileno()方法对象.第一个参数是需要等待输入的对象,第二个指定等待输出的对象,第三个参数指定异常情况的对象.第四个参数则为设置超时时间,是一个浮点数.指定以秒为单位的超时值.select函数将会返回一组文件描述符,包括输入,输出以及异常. 在linux

  • 利用python模拟实现POST请求提交图片的方法

    本文主要给大家介绍的是关于利用python模拟实现POST请求提交图片的方法,分享出来供大家参考学习,下面来一看看详细的介绍: 使用requests来模拟HTTP请求本来是一件非常轻松的事情,比如上传图片来说,简单的几行代码即可: import requests files = {'attachment_file': ('1.png', open('1.png', 'rb'), 'image/png', {})} values = {'next':"http://www.xxxx.com/xxx

  • python判断字符串是否纯数字的方法

    本文实例讲述了python判断字符串是否纯数字的方法.分享给大家供大家参考.具体如下: 判断的代码如下,通过异常判断不能区分前面带正负号的区别,正则表达式可以根据自己需要比较灵活的写,通过isdigit方法用来判断是否是纯数字,测试代码如下 复制代码 代码如下: #!/usr/bin/python # -*- coding: utf-8 -*- a = "1" b = "1.2" c = "a" #通过抛出异常 def is_num_by_exc

  • Python文件的读写和异常代码示例

    一.从文件中读取数据 #!/usr/bin/env python with open('pi') as file_object: contents = file_object.read() print(contents) =================================== 3.1415926 5212533 2324255 1.逐行读取 #!/usr/bin/env python filename = 'pi' with open(filename) as file_obje

随机推荐