这其实是一个编码规范的问题,没有任何场景都适用的解决方案,就好比有了 list,但是还是需要 tuple,所以对于抛出异常好,还是返回值好,是需要具体情况看的。

在 C 语言中,通用的做法是函数返回一个 code 描述状态,例如 main 函数,一般返回 0 就是正常,其他数值就需要去查错误码。这种方式仍广泛使用于 HTTP API 等接口。而到了面向对象编程语言,异常也是一个类的实例,用于表达特定的意思,这样异常有了更丰富的表现方式,处理方式也显得更优雅。

但是异常的捕获就是万能的了吗?

并不是,现实情况是,不少人仍是“错误”的处理异常。例如从头到尾的一个 try except,并且捕获所有异常,这就是为了处理异常而处理异常,反而增加了代码量。

异常捕获其实也是需要讲究技术的,就好比会写代码,不一定会写出优雅的代码、高效的代码;会捕获异常,不一定会“优雅”地捕获异常。

对于开发团队的管理者来说,一些编码“规范”(例如何时改抛出异常,怎么捕获等)也是越早立下越好,对于后期项目的维护和转移是非常有利的。

对于开发者来说,一些编码“规范”的培养,不但是个人编码“素养”的提高,也是技术视野的提升。一段时间后反观自己过去的代码,一定会觉得怎么写的这么“丑陋”。

下面我也简单讲一下什么场景下该怎么“使用”异常。

如下情况应该尽量使用异常处理:执行的错误情况非常多样化,单一的返回值无法表示多种情况

执行的错误需要调用方区别对待

方法的调用层次比较深,抛出异常能使代码更简洁且易读

用于链式调用的方法,例如生成器模式中,避免调用方多余的判断

如下情况应该尽量避免使用异常处理:不要用异常做条件判断,条件判断语句的性能一般更好

方法返回值简单,且用于条件判断的,例如 if 语句中的子串查找都用 find 而不是 index

下面是异常处理的一些规范分享:不要在最外层调用整段 try except,这非常不负责任,而且也不好 debug

一般捕获的都是 Exception 异常的子类,一般情况下不用捕获底层异常

系统一般都推荐定义自己的异常类(甚至是异常类树),即使内容是空的(最好有文档和__str__),便于区分

尽量捕获明确的子类异常,用多 catch 捕获,最后可以捕获 Exception,不要上来就直接捕获 Exception,区分异常的类型能更好的帮助我们区别处理

不要为了不抛出异常而去捕获并抛弃,如果不能处理,就抛给上层调用者

要善于使用 finally 和 else,特别是数据库事务,连接等需要主动关闭或回滚的情况

不需要每次捕获都打印日志,规划好日志级别,不然日志会难以阅读

捕获严重异常后打印日志最好用 traceback 带上调用链信息,便于定位问题

先写这么多吧,语言等技术只是实现方式,最后还是得看我们需要解决的问题。

python函数式编程读取数据时出现错误_Python编程中,函数遇到问题是抛出错误好还是约定返回值好?...相关推荐

  1. python函数式编程读取数据时出现错误_写 Python 代码不可不知的函数式编程技术...

    原标题:写 Python 代码不可不知的函数式编程技术 选自 Medium 作者:Raivat Shah 参与:魔王.Jamin 本文对 Python 中的函数式编程技术进行了简单的入门介绍. 近来, ...

  2. python存储和读取数据时出现错误_python读取json文件存sql及codecs读取大文件问题...

    preface: 最近帮师兄处理json文件,需要读到数据库里面,以备其后续从数据库读取数据.数据是关于yelp网站里面的: https://github.com/Yelp/dataset-examp ...

  3. python从csv读取数据到网页输入框_python中怎么把csv文件读取的数据显示在网页上...

    python的标准库csv库主要是面向本地文件,就是说你的CSV文件得存储在你的电脑上.当进行网络数据采集的时候,很多文件都是在线的.不过有一些办法可以解决这个问题: 1,手动把CSV文件下载到本机, ...

  4. javascript如何手动抛出错误?

    前言 在javascript中通常使用throw语句抛出错误,throw语句用于抛出一个用户自定义的错误. 例如:抛出了一个值为字符串的错误 throw 'abc'; 例如:抛出了一个错误对象 thr ...

  5. koa --- 使用中间件多层级抛出错误

    说明 能够熟练的掌握错误的抛出,可以在一定程度上提高代码的开发效率和可读性 构造错误 本栗采用调用一个不存在的函数来抛出错误 const Koa = require('koa'); const app ...

  6. python函数式编程读取数据-python学习笔记9:函数式编程

    函数式编程(FunctionalProgramming) 基于lambda演算的一种编程方式 程序中只有函数 函数可以作为参数,同样可以作为返回值 纯函数式编程语言: LISP, Haskell Py ...

  7. android获取错误原因,从http读取数据时发生OutOfMemory错误获取请求android

    我正在做一个http获取请求.我需要接收大量数据,但在读取数据时出现OutOfMemory异常.从http读取数据时发生OutOfMemory错误获取请求android 我的代码: public st ...

  8. Scattering:将数据写入到buffer时,可以采用buffer数组,依次写入 [分散] || Gathering: 从buffer读取数据时,可以采用buffer数组,依次读

    package com.atguigu.nio;import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.n ...

  9. 解决 pandas 读取数据时内存过大的问题

    解决 pandas 读取数据时内存过大的问题 背景: 在我们使用pandas进行数据处理的时候,有时候发现文件在本地明明不大,但是用pandas以DataFrame形式加载内存中的时候会占用非常高的内 ...

最新文章

  1. 动手扩充FreeTextBox的功能
  2. 第一篇博客,java学生管理系统(挑战全网最全)
  3. 如何做一个听话的 “输入框”
  4. 学python心得体会1000字-学习python cgi的一点心得体会
  5. 为什么“或命题真假的判断是有真则真?
  6. 常用系统存储过程有:
  7. 计算机网络可以按哪些原则分类,计算机网络的分类
  8. 添加错误debug信息
  9. php swoole hyperf,【php】Hyperf为什么要关闭Swoole协程短名称
  10. android cpu 压力测试,两个古董级压力测试工具 leakyapp.exe 和 cpustre.exe
  11. 中国连接系统市场趋势报告、技术动态创新及市场预测
  12. python做单因素方差分析
  13. 虚拟机中安装windows XP系统
  14. 利用动态数组生成魔方矩阵
  15. 怎么让代码的逻辑更清晰?
  16. .so文件移动游戏破解范例
  17. matlab背景色为白色
  18. 微信小程序模板template的使用
  19. 项目十大管理(四)成本管理
  20. win10取消默认文件打开方式

热门文章

  1. Cisco 3560 Qos限速配置
  2. SQL Server 开发指南(经典教程)
  3. 桌面虚拟化之用户行为审计
  4. [赵星理]《简单男人》--歌曲温暖你的心,激励你前进
  5. jquery级试题_JS-jQuery练习题面试题
  6. zookeeper数据结构及Znode类型
  7. super go_Go 简单性的价值:来自对 Go 倍加青睐的谷歌软件工程师的自述
  8. 汉子编码比字母编码长_字母/博客作者编码问题(使用动态编程)
  9. python 打印列表元素_Python程序以不同方式打印列表元素
  10. kailinux mysql提权_linux下mysql提权