在 Python 中使用 try- except-else 是一个好习惯吗?

2024-03-09

在 Python 中,我时常会看到这样的块:

try:
   try_this(whatever)
except SomeException as exception:
   #Handle exception
else:
   return something

try- except-else 存在的原因是什么?

我不喜欢这种编程,因为它使用异常来执行流程控制。然而,如果它被包含在语言中,一定有一个充分的理由,不是吗?

据我了解,异常不是错误,并且它们应该只用于特殊情况(例如,我尝试将文件写入磁盘,但没有更多空间,或者可能我没有权限),而不是用于流量控制。

通常我将异常处理为:

something = some_default_value
try:
    something = try_this(whatever)
except SomeException as exception:
    #Handle exception
finally:
    return something

或者如果我真的不想在发生异常时返回任何内容,那么:

try:
    something = try_this(whatever)
    return something
except SomeException as exception:
    #Handle exception

“我不知道这是否是出于无知,但我不喜欢这样 一种编程,因为它使用异常来执行流程控制。”

在Python世界中,使用异常进行流程控制是常见且正常的。

即使是 Python 核心开发人员也使用异常进行流程控制,并且这种风格已深深融入到该语言中(即迭代器协议使用停止迭代 http://docs.python.org/2.7/library/exceptions.html#exceptions.StopIteration发出循环终止信号)。

此外,try- except 风格用于防止某些程序中固有的竞争条件。“三思而后行” http://docs.python.org/2.7/glossary.html#term-lbyl结构体。例如,测试os.path.存在 http://docs.python.org/2.7/library/os.path.html#os.path.exists导致信息在您使用时可能已经过时。同样地,队列已满 http://docs.python.org/2.7/library/queue.html#Queue.Queue.full返回可能已过时的信息。这尝试除其他风格 http://docs.python.org/2.7/glossary.html#term-eafp在这些情况下将生成更可靠的代码。

“据我了解,异常不是错误,它们应该只是 用于特殊条件”

在其他一些语言中,该规则反映了其图书馆所反映的文化规范。该“规则”也部分基于这些语言的性能考虑。

Python 文化规范有些不同。在很多情况下,你must使用异常来控制流。此外,在 Python 中使用异常不会像在某些编译语言中那样减慢周围代码和调用代码的速度(即,CPython http://en.wikipedia.org/wiki/CPython已经实现了在每一步进行异常检查的代码,无论您是否实际使用异常)。

换句话说,你对“例外是为了例外”的理解是一条在其他一些语言中有意义的规则,但对 Python 来说则不然。

“但是,如果它包含在语言本身中,则必须有一个 这是一个很好的理由,不是吗?”

除了帮助避免竞争条件之外,异常对于将错误处理拉到循环之外也非常有用。对于解释型语言来说,这是必要的优化,因为解释型语言往往不会自动执行循环不变代码运动 http://en.wikipedia.org/wiki/Loop-invariant_code_motion.

此外,在处理问题的能力与问题发生的地方相去甚远的常见情况下,异常可以大大简化代码。例如,通常有顶级用户界面代码调用业务逻辑代码,而业务逻辑代码又调用低级例程。低级例程中出现的情况(例如数据库访问中唯一键的重复记录)只能在顶级代码中处理(例如要求用户提供不与现有键冲突的新键)。对这种控制流使用异常允许中级例程完全忽略该问题,并与流控制的该方面很好地解耦。

有一个关于例外的必要性的好博客文章 http://uberpython.wordpress.com/2012/09/23/why-im-not-leaving-python-for-go/.

另请参阅此堆栈溢出答案:异常真的是针对异常错误吗? https://stackoverflow.com/questions/180937/are-exceptions-really-for-exceptional-errors

“try- except-else 存在的原因是什么?”

else 子句本身很有趣。它在没有异常时但在finally 子句之前运行。这是它的主要目的。

如果没有 else 子句,在最终确定之前运行附加代码的唯一选择是将代码添加到 try 子句的笨拙做法。这很笨拙,因为它有风险 在不受 try 块保护的代码中引发异常。

在最终确定之前运行额外的不受保护的代码的用例并不经常出现。因此,不要期望在已发布的代码中看到很多示例。这有点罕见。

else 子句的另一个用例是执行在没有异常发生时必须发生的操作以及在处理异常时不会发生的操作。例如:

recip = float('Inf')
try:
    recip = 1 / f(x)
except ZeroDivisionError:
    logging.info('Infinite result')
else:
    logging.info('Finite result')

另一个例子发生在单元测试运行程序中:

try:
    tests_run += 1
    run_testcase(case)
except Exception:
    tests_failed += 1
    logging.exception('Failing test case: %r', case)
    print('F', end='')
else:
    logging.info('Successful test case: %r', case)
    print('.', end='')

最后,try 块中 else 子句最常见的用途是进行一些美化(在同一缩进级别上对齐异常结果和非异常结果)。这种使用始终是可选的,并不是绝对必要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中使用 try- except-else 是一个好习惯吗? 的相关文章

  • Python argparse 作为函数

    以这种方式获取命令行参数有什么本质上的错误吗 我的意思是把参数解析放入它自己的函数中 它会被认为是非 Pythonic 或更严重吗 usr bin python import argparse def getArgs argv None p
  • 使用 Python 将列名称与 CSV 文件中的数据对齐

    这是我用来将数据写入 csv 文件的代码 with open temp csv a as fp a csv writer fp delimiter t data faceXpos faceYpos faceHeight faceWidth
  • Python 正则表达式从文本中提取域

    我有以下正则表达式 r a zA Z0 9 a zA Z0 9 61 a zA Z0 9 a zA Z 2 6 当我将其应用于文本字符串时 比方说 这是 www website1 com 这是 website2 com 我得到 www we
  • 如何使用格式保存 Tkinter 文本小部件的内容

    我在 python 中使用 Tkinter 在文本窗口中显示输出 我发现使用 get 功能我可以从此窗口检索文本内容 但我有用不同背景颜色标记的文本部分 是否可以将内容与这些颜色一起复制到文件 例如 html 或 doc 中 没有对你想要的
  • PyQt5 的 OpenGL 模块和版本控制问题(调用不正确的 _QOpenGLFunctions_(ver))

    我一直在努力得到PyQt5 helloGL 示例代码 https github com baoboa pyqt5 blob master examples opengl hellogl py编译 当我尝试构建解决方案时 我得到 Traceb
  • 我可以在pycharm中的断点处进入交互模式吗

    我是一个相当新的 Pycharm 3 用户 正在从事 django 项目 我可以在 pycharm3 中的断点处进入交互模式吗 这可能吗 当程序在断点处停止时 我尝试过工具 gt 打开调试命令行 但我没有看到控制台打开 我怎样才能让它发挥作
  • R.scale() 和 sklearn.preprocessing.scale() 之间的区别

    我目前正在将数据分析从 R 转移到 Python 当在 R 中缩放数据集时 我将使用 R scale 根据我的理解 它将执行以下操作 x mean x sd x 为了替换该函数 我尝试使用 sklearn preprocessing sca
  • 统计Sweep算子的Python实现

    我正在学习一些用书中缺失的数据进行统计的技术 缺失数据的统计分析作者 利特尔和鲁宾 对于处理单调无响应数据来说 一个特别有用的函数是扫频操作员 详情见第 148 151 页 我知道 R 模块gmm有swp函数可以做到这一点 但我想知道是否有
  • 如何在 Django 中像应用程序一样从配置中注册 Flask 蓝图?

    如何从我的配置中注册 Flask 蓝图 就像 Django 中的应用程序一样 我想在配置文件中定义蓝图 它将自动注册 config py BLUEPRINTS news files 实际上我一直在一个暂定名为的项目中勾勒出类似的东西臀部口袋
  • pandas groupby 并转换为 json 列表

    我有一个如下所示的 pandas 数据框 idx f1 f2 f3 1 a a b 2 b a c 3 a b c 87 e e e 我需要将其他列转换为基于索引列的字典列表 所以 最终结果应该是 idx features 1 f1 a f
  • Python3 - 如何将字符串转换为十六进制

    我正在尝试将字符串逐个字符转换为十六进制 但我无法在Python3中弄清楚它 在较旧的 python 版本中 我的以下内容有效 test This is a test for c in range 0 len test print 0x s
  • 如何在solidpython中设置特殊变量$fa、$fs、$fn

    in 上一个线程 https stackoverflow com questions 54040390 how to save data in stl file after python solid processing显示了如何通过 So
  • 如何在 FastAPI Swagger API 中按方法类型对方法进行排序?

    如何在 FastAPI Swagger 自动文档中设置 API 方法的排序顺序 我希望所有方法按类型分组 GET POST PUT DELETE 这个答案 https stackoverflow com questions 24951268
  • AppEngine 警告 - OpenBLAS 警告 - 无法确定该系统上的 L2 缓存大小

    我尝试在 GC AppEngine 上部署应用程序 部署过程中没有错误 但应用程序无法运行 仅显示加载页面 日志中唯一一个奇怪的原始日志 OpenBLAS WARNING could not determine the L2 cache s
  • 如何在 Python 中连接两个列表?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 如何在 Python 中连接两个列表 Example listone 1 2 3 lis
  • Hoare Partitioning算法讲解

    根据许多网站给出的伪代码 我写了这个Hoare分区算法 它采用一个数组 根据给定的主元来分区子数组的开始和结束索引 它工作得很好 但是有人可以解释一下逻辑 它是如何做到这一点的吗 这是代码 def hoare arr start end p
  • 内置模块位于哪里?

    我尝试查找列出的所有目录sys path但我找不到任何builtins py文件 那么它在哪里呢 从字面上看 该模块内置于 python 解释器中 gt gt gt import builtins gt gt gt builtins
  • 在 try catch 块中返回到 catch 内是否不好?这是很好的做法

    在 try catch 块中从 C 中的 catch 块返回值是不好的做法吗 try Some code return 1 catch return 0 哪种使用 try catch 的方法是好的做法 不需要 只要返回的值是你想要的 你可以
  • 重写 __cmp__ python 函数

    嗨 我是压倒一切的 cmp 如果传递的第二个对象是None 或者如果它不是一个实例someClass 然后返回 1 我不明白这里到底发生了什么 class someClass def cmp self obj if obj None ret
  • 收到 Python 错误“来自:无法读取 /var/mail/Bio”

    我正在运行一个 bio python 脚本 这会导致以下错误 from can t read var mail Bio 由于我的脚本与邮件没有任何关系 我不明白为什么我的脚本在 var mail 中查找 这里似乎有什么问题 我怀疑这会有帮助

随机推荐

  • 这些关键字在sql server中的用途是什么(UPDLOCK,ROWLOCK READPAST)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想知道这些关键字在sql server中有什么用 UPDLOCK ROWLOCK READPAST 以及何时使用它 我的意思是人们在什么
  • iOS:JSONObjectWithData

    我将 Xcode 更新到版本 7 并尝试重用我的旧代码 let downloadTask NSURLSessionDownloadTask sharedSession downloadTaskWithURL dataURL completi
  • 实时通知未发送

    我试图在 ASP NET Boilerplate 中显示实时通知 但未发送 public override async Task
  • NumPy 结构化数组的真正递归“tolist()”

    据我了解 将 NumPy 数组转换为本机 Python 列表的推荐方法是使用ndarray tolist http docs scipy org doc numpy reference generated numpy ndarray tol
  • 有没有一个工具可以对 PLSQL 进行负载测试

    我知道 utplsql 用于单元测试 有没有办法可以在循环中使用它来加载测试我的存储过程 我不想使用 JMeter 或通过任何 JDBC 驱动程序 只是想分析普通存储过程的性能 我认为单元测试工具不是正确的方法 因为您并没有真正对功能做出断
  • 你如何向新程序员解释面向对象? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的亲戚正在学习编程 并且很难理解课程 例如 他很难理解您需要实例化它 方法无法访问其他方法中的变量 如果您更改类的一个实例中的变量 则它
  • 使用 sed 更改文件中的字符串?

    我有一个带有模板的输入文件 如下所示 我想更改版本 使用 sed Package somename Priority extra Section checkinstall Maintainer email protected cdn cgi
  • 如何在 Perl 中使用 HTTP::Async 一次发出 25 个请求?

    我正在执行大量 HTTP 请求 并选择 HTTP Async 来完成这项工作 我要发出超过 1000 个请求 如果我只是执行以下操作 请参阅下面的代码 许多请求在处理时就会超时 因为处理到达它们之前可能需要数十分钟 for my url u
  • 报告查看器控件不显示来自 SSRS 的报告

    我在 VS 2013 中使用 MS Report Viewer 10 该项目正在从 VS 2010 升级 我已经解决了一系列与报表查看器相关的问题 并让控件本身启动并运行 我在 SSRS 中有很多报告 并且我已经确认这些报告本身可以正常工作
  • View.playSoundEffect 有问题吗?

    我正在尝试播放声音效果 使用View playSoundEffec 方法 当按钮获得焦点时 问题是除非启用目标手机的声音选择 否则效果将永远不会播放 它可以从以下位置启用 Settings gt Sounds display gt Audi
  • PHP 将 Excel 导入数据库(xls 和 xlsx)

    我尝试搜索一些插件将Excel文件导入MySQL数据库 其中之一是http code google com p php excel reader http code google com p php excel reader 该工具非常强大
  • 如何使用rails运行简单的MYSQL查询

    我想使用 Rails 运行一个简单的 MYSQL 查询 Select movie title movie director from moving order by rating desc limit 5 我不想要创建模型的所有开销 我只想
  • 元组 (a,b)=(b,a) 中的成员交换在内部如何工作?

    In 55 a 5 In 56 b 6 In 57 a b b a In 58 a Out 58 6 In 59 b Out 59 5 a 和 b 的值交换在内部是如何工作的 它绝对不使用临时变量 Python 将右侧表达式与左侧赋值分开
  • android-studio的sdk管理器中没有LLDB

    I am using android studio 3 6 3 in my Manjaro Linux I am trying to run c in android studio for that i need LLDB I reinst
  • ReactJS错误编译失败'define'未定义

    我尝试编译的应用程序未使用外部 jquery 及其关联的 JS 文件进行编译 当我尝试将这些文件链接到 ReactJS 应用程序中的 HTML 页面时 它会抛出以下错误 错误是 define 未定义 no undef 此错误来自 jquer
  • 改造,回调 204 无内容响应?

    在 Android 上 我最初实现了一个像这样的 Retrofit 界面 DELETE USER API BASE URL id public void deleteUser Path id String id Callback
  • 当同级项具有不同宽度时将 Flex 项居中[重复]

    这个问题在这里已经有答案了 我知道 Flexbox 为居中项目提供了一个很好的解决方案 但是当我有 3 个项目并且我希望中心 第二个 项目相对于窗口居中时 我遇到了一个问题 而不管其他 2 个项目的大小 在我的笔中 您可以看到第二项 客户索
  • eclipse neon - 忽略 json 错误

    我的项目中只有很少的 JSON 并将它们导入 Eclipse 后Neon我在文件 和项目 上看到红色标记 抱怨 JSON 问题 我的问题是如何禁用 跳过 忽略 Eclipse Neon 中的 JSON 错误 您可以在下面配置 JSON 验证
  • jquery 文档内部或外部的函数就绪

    到目前为止 我只是将所有 jQuery 优点都放在了 document ready 函数 包括某些用户交互中使用的简单函数 但是不需要加载 DOM 文档或仅在之后调用的函数可以放置在 document ready 以及 例如 考虑一个非常简
  • 在 Python 中使用 try- except-else 是一个好习惯吗?

    在 Python 中 我时常会看到这样的块 try try this whatever except SomeException as exception Handle exception else return something try