Home > Backend Development > Python Tutorial > Python 的异常机制及规范是否相当不人性化?

Python 的异常机制及规范是否相当不人性化?

WBOY
Release: 2016-06-06 16:23:25
Original
1072 people have browsed it
  1. python的标准库中都众所周知各种随处随手的 raise,遑论各种质量参差的第三方库?
  2. python的官方 PEP8 标准中却又明确要求
When catching exceptions, mention specific exception

这分明是霸王条款一般的语言规范,如果要客户做到 catch specific exception,那么至少你的语言层面要有 raise specific exception 的机制吧(类似 java?),然而 python 并没有。

实在有些令人哭笑不得。

回复内容:

你们啊,不要想喜欢弄个大新闻。拿Java来黑Python前别忘了你家语言里也有unchecked exception。

原文明明是这样的:
When catching exceptions, mention specific exceptions whenever possible instead of using a bare except: clause.
这意思太明确了:
  1. 如果可能的话,尽量捕捉更specific的exception
  2. 而不是用except:来捕捉所有异常。

你要明白PEP8不是强制标准。即使它是强制的,except Exception:也足够满足这个条款,不知道题主『哭笑不得』在哭啥笑啥。


原因需要结合PEP8里关于Exception的部分:

Derive exceptions from Exception rather than BaseException

从BaseException继承的exception中,最常见的就是KeyboardInterrupt了。如果你的代码里用except:来捕捉异常,会导致长时间执行的代码无法用ctrl+c来终止。

一个代码良好的library,应该会自己定义一个base的exception class(比如说FooException),然后再从这个exception继承更详细的exception(比如说IlligalFooException)。这样你的代码使用的时候可以except FooException捕捉这个library的所有可能异常,也可以用except IlligalFooException来捕捉更详细的异常。

如果你用的library不是以这样的形式定义异常,而是直接重用 6. Built-in Exceptions,建议直接扔掉。 题主的意思应该希望Python有Java一样的checked exception,也就是在函数体上写明可抛异常种类,甚至可以做编译检查,而不是像现在一样,只能查文档和看源代码。

但是Python这种动态语言本来在编译时就没多少检查,不仅不告诉你能抛什么异常,连参数和返回值可以是什么类型都没有,为什么单独揪着没有exception specification来说呢?Python的风格就是一切运行时再决定,不爽不要用。 你先举个随手raise的例子吧 @yegle 大婶回答的,excited!

恰好上周重构一个小程序的时候,搜了一些异常处理相关资料,罗列一下:
0. Robust exception handling
嗯。这篇博文中首先就提到了 LBYLEAFP 这两种错误处理模式,还提到 Exceptions vs. error status codes 之间的抉择。
1. Write Cleaner Python: Use Exceptions
这篇博文讲的是如何通过合理地利用 Python 异常机制编写更清晰的 Python 的代码
这篇博文还提到,在 Python 中,异常无处不在,所以不要觉得到处 raise 就不好了。毕竟,即使有未处理异常,程序也不至于像 C++ 中那样直接 terminated 了。
2. Re-raising Exceptions
这篇提到,以 raise 为目的的 try...except:/try...except Exception: 不是耍流氓:
<code class="language-python"><span class="k">try</span><span class="p">:</span>
    <span class="o">...</span>
<span class="k">except</span><span class="p">:</span> <span class="c"># except Exception:</span>
    <span class="o">...</span>
    <span class="k">raise</span> <span class="c"># excited!</span>
</code>
Copy after login
看优秀的库, werkzeug/exceptions.py at master · mitsuhiko/werkzeug · GitHub

全凭自觉
Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template