我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python异常编程技巧

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python异常编程技巧

编程中经常会需要使用到异常处理的情况,在阅读了一些资料后,整理了关于异常处理的一些小技巧记录如下。

如何自定义异常

定义异常类

在实际编程中,有时会发现Python提供的内建异常的不够用,我们需要在特殊业务场景下的异常。这时就需要我们来定义自己的异常。按照Python约定俗成的习惯,用户定义的异常一般都是继承于Exception类,由它开始拓展。后面我们可以看到这样做在捕获异常的时候会带来很大的便利。

>>> class MyError(Exception):
        pass

>>> raise MyError(u"something error")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.MyError: something error  

API异常相关的技巧

API的异常分为定义异常与调用API时如何捕获异常两个部分,这二者相辅相成。

定义API异常的技巧

在自己编写API的时候,应该定义Root Exception——API中的根异常,其它异常都继承于它。这样的做法有两个好处:

  1. API代码层次更清晰

  2. API与调用程序代码隔离

假设存在如下场景:需要做一个链接数据库服务的模块。提供一个connect函数用于链接。那么,在链接的过程中,就会发生以下几种情况:

  • socket连接超时

  • socket拒绝连接

针对以上的情况,我们在模块中定义几个异常:

# database.py
class Error(Exception):
    """Root exception for all exceptions raised by this module."""
    
class SocketTimeError(Error):
    pass

class SocketRefuseError(Error):
    pass
    
def connect():
    pass    

调用API时异常捕获的技巧

这样在调用API的时候就可以这样使用:

try:
    connect()
except SocketTimeError as err:
    log.error(err)
except SocketRefuseError as err:
    log.error(err)
except Error as err:
    log.error("API Unexpected error:%s" % err)
except Exception:
    log.error("API bug cause exception.")    

这样精确定义多个异常,使得代码层次清晰,增强了可读性。值得注意的是:在代码的最后还捕获了Error以及Exception两个异常,这两个操作分别对应于可拓展性与健壮性的目的。

捕获Root Exception以提高可拓展性:

我们知道,在实际链接数据库时,还可能会出现用户没有登陆权限等问题。所以,我们需要在下一个版本中加入PermissionDeny这个异常。但是,旧的调用代码已经写好了,如果忘记修改的话,这个异常可能就会无法被处理,进而使得调用的程序奔溃。处于这样的考虑,我们在调用API的时候,就应该再捕获API的Root Exception,即使之后新加入了其它的异常,在这一个except中也能被捕获而不影响调用程序。使得API模块的可拓展性得到了提高。

捕获Exception以提高健壮性:

在调用API的时候,难免可能出现API内部存在bug的情况。这个时候如果捕获了Exception的话,就算API内部因为bug发生了异常,也不会影响到调用程序的正常运行。

从这两点中可以看出,要达到这种效果,其实都要依赖于常规异常继承于Exception类这个规矩。这样的架构划分所带来的好处是显而易见的。

与异常相关的编程艺术

异常代替返回状态码

我们经常需要编写一些工具类的函数,往往在这些函数的处理流程中,会产生很多的状态;而这些状态也是调用者需要得到的信息。很多时候,会用一些具有意义的返回值来表示函数处理的状态。
比如:

def write(content):
    if isinstance(content, basestring):
        f_handler = open("file.txt", 'w')
        try:
            f_handler.write(context)
            except Exception:
                return -2    # write file fail
        else:
            return 0    # write file succcess
        finally:
            f_hanlder.close()
    else:
        return -1    # arg type error

调用代码:

result = write()
if result == -1:
    log.error(u"type error")
elif result = -2:
    log.error(u"write error")
else:
    log.info("ok")    

这种状态码的方式使用起来特别的不方便,调用者还需要去理解每个状态码的意义,带来其它的学习成本;而且用if-else结构也不易于后期的程序拓展。所以,我们可以使用触发异常来代替返回状态码,每个异常名其实就包含了状态的意义在内(命名的艺术),使用起来也更好理解。

使用异常的方式:

class Error(Exception):
    pass
    
class OpenFileError(Error):
    pass
    
class WriteContentError(Error):
    pass    

def write(content):
    if isinstance(content, basestring):
        f_handler = open("file.txt", 'w')
        try:
            f_handler.write(context)
            except Exception:
                raise WriteContentError
        finally:
            f_hanlder.close()
    else:
        raise OpenFileError

调用代码:

try:
    write()
except OpenFileError as e:
    log.error(e)
except WriteContentError as e:
    log.error(e)
except Error:
    log.error("API Error")
except Exception
    log.error("API Bug")    
else:
    log.info("ok")

结合上面一点提到的使用API时的异常捕获,使得调用代码变得更佳灵活。

异常处理与流程控制

错误处理很重要,但如果它搞乱了代码逻辑,就是错误的做法

将异常处理与正常流程控制混为一谈时,代码是十分丑陋的。我们应该将二者分离,最好的做法就是将异常代码块抽离到另外的函数中。

try:
    action_a()
    action_b()
    action_c()
except ActionException as e:
    log.error(e)
else:
    action_d()    

将异常处理分离:

def action_executor():
    action_a()
    action_b()
    action_c()
    
def action():
    try:
        action_executor()
    except ActionException as e:
        log.error(e)
        
action()
action_d()

参考资料

  • 《clean code》

  • 《Python3 OOP》

  • 《effective python》

  • python官方手册

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python异常编程技巧

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

下载Word文档

猜你喜欢

Python异常编程技巧

编程中经常会需要使用到异常处理的情况,在阅读了一些资料后,整理了关于异常处理的一些小技巧记录如下。如何自定义异常定义异常类在实际编程中,有时会发现Python提供的内建异常的不够用,我们需要在特殊业务场景下的异常。这时就需要我们来定义自己的
2023-01-31

Python编程常用技巧有哪些

这篇文章主要介绍“Python编程常用技巧有哪些”,在日常操作中,相信很多人在Python编程常用技巧有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python编程常用技巧有哪些”的疑惑有所帮助!接下来
2023-06-16

Python 异常处理技巧大公开,助你成为编程高手

异常处理是 Python 中一项基本技能,本文介绍了一些常见的异常处理技巧,帮助你成为一名优秀的 Python 程序员。
Python 异常处理技巧大公开,助你成为编程高手
2024-02-24

python编程技巧——转载

学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛中自动登录自动发贴的脚本,写过自动收邮件的脚本,写过简单的验证码识别的脚本,本来想写google music的抓取脚本的,结果有了强
2023-01-31

Python编程开发技巧

这篇文章给大家分享的是有关Python编程开发技巧的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、小数保留指定位小数1.%f 方法f = 1.23456f1 = %.4f % ff2 = %.2f % fpri
2023-06-14

学习Golang异步编程的技巧

学习Golang异步编程的技巧随着互联网技术的不断发展,对于高效并发处理的需求也日益增加。在编程领域,异步编程是一种常见的解决方案,可以有效提高程序的性能和响应速度。Go语言作为一门支持并发编程的高级编程语言,其内置的goroutine和
学习Golang异步编程的技巧
2024-02-29

python中有哪些异常处理技巧

这篇文章给大家介绍python中有哪些异常处理技巧,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于编写自
2023-06-14

有哪些Python编码常用技巧

这篇文章主要介绍“有哪些Python编码常用技巧”,在日常操作中,相信很多人在有哪些Python编码常用技巧问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有哪些Python编码常用技巧”的疑惑有所帮助!接下来
2023-06-16

Python有什么编程技巧

本篇内容介绍了“Python有什么编程技巧”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 原地交换两个数字Python 提供了一个直观的
2023-06-17

python的30个编程技巧

1、原地交换两个数字1 x, y =10, 202 3 print(x, y)4 5 y, x = x, y6 7 print(x, y)10 2020 102、链状比较操作符1 n = 102 3 print(1 < n < 20)4 5
2023-01-30

Python中的异常处理技巧有哪些?

Python中的异常处理技巧有哪些?需要具体代码示例Python是一种易于学习和使用的编程语言,它提供了强大的异常处理机制,可以帮助程序员增强代码的可靠性和可维护性。在编写Python程序时,我们经常会遇到各种各样的异常情况,如文件读写错误
2023-10-22

Python CPython 中的异常处理与调试技巧

理解 Python CPython 中的异常处理和调试技巧对于高效开发和问题解决至关重要。本文将深入探讨异常处理、调试工具和技巧,以帮助你提升 Python 编码能力。
Python CPython 中的异常处理与调试技巧
2024-03-04

Python的编程技巧有哪些

以下是一些Python编程的技巧:1. 使用列表推导式:列表推导式是一种简洁的方式来创建列表。它可以通过迭代一个可迭代对象,并根据条件生成新的列表。例如:[x**2 for x in range(10) if x%2 == 0]2. 使用生
2023-09-25

Android编程常用技巧实例总结

本文实例讲述了Android编程常用技巧。分享给大家供大家参考,具体如下: 1. 登录的时候,如果输入有误,则输入框左右震动,表示输入有误 在res下准备一个anim文件夹,里面包含两个文件,main_login_shake.xml 和 m
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录