Python和例外

Mar*_*cny 4 python exception

来自Java背景,当我被警告我没有捕获异常而不必阅读文档时,我喜欢它.如果我确实阅读了有关方法的文档,则抛出的异常会在文档的方法签名中显示.

使用Python,我必须经常阅读文档中的一段文字,找到一个句子,说明将抛出什么异常.

此外,我今天在Python中使用了第三方库,http://packages.python.org/kombu/reference/kombu.connection.html,这激怒了我.没有标准的文档格式?我使用的是通道方法(http://packages.python.org/kombu/reference/kombu.connection.html#kombu.connection.BrokerConnection.channel),它甚至没有声明它会引发异常.我必须通过反复试验找到这个.

我在这里遗漏了一些明显的东西,或者在Python及其文档中将异常视为事后的想法.

小智 14

我们喜欢例外.它们是非常重要的语言功能.好的文档通常会说明在哪些情况下会抛出什么异常,而且我个人发现大多数文档在这方面都很好.当然,总有一定比例的文档不好.无论哪种方式,如果你正在为每个功能寻找一个明确的独立列表,那你就不走运了.除了编写代码的程序员之外,没有人知道这一点.

阅读一段对我来说听起来并不是太糟糕,特别是因为段落的信息通常非常重要.然后就是<Ctrl+F>raises<Enter>......

没有标准的文档格式?

有许多项目使用的Sphinx(包括docs.python.org所以你已经知道它;还包括你链接到的项目,尽管它使用不同的光学风格).当然,没有人可以强制每个项目都使用它,就像你不能强迫它们使用标准的编码风格一样.但老实说,我认为到目前为止我使用的所有项目除了两个(PyGame和LEPL)都使用了Sphinx.这可能是因为我必须使用相对较少的功能,这要归功于广泛的标准库,但仍然如此.

当我被警告说我没有抓到异常时我喜欢它

为什么?粗略猜测,60%的初学者获得的例外是因为他们没有正确编码,不是因为需要处理的一些特殊的环境状态.TypeError并且ImportError,例如,根本不会出现在无错误的编写良好的程序中(保存元编程和需要极端动态的部分).

通常,如果您希望编译器告诉您有关您尚未了解的代码的信息,那么您使用的是错误的语言.Python是动态的,你测试而不是静态分析.处理它.


Ste*_*ski 6

Bruce Eckel 详细讨论了 Java检查异常与Python异常.关键报价:

当我开始使用Python时,出现了所有异常,没有一个被意外"消失".如果你想捕获一个异常,你可以,但是你不会被迫一直编写大量的代码只是为了传递异常.它们会到达你想要捕捉它们的地方,或者如果你忘记了它们就会完全消失(因此它们会提醒你)但它们并没有消失,这是所有可能情况中最糟糕的情况.我现在相信经过检查的例外会鼓励人们使它们消失.此外,它们的代码可读性更低.

值得一读整篇文章.

关于文档,我说是的,有些文档很糟糕.


cwa*_*ole 5

Python对声明Java所做的异常没有相同的要求.大多数语言没有.就此而言,Java通常会抛出未立即声明的异常(NullPointerException任何人?).记录所有语言中的异常是礼貌的,但在一个我们甚至无法保证甚至会记录公共方法的世界中,这真的令人惊讶吗?

查看您正在使用的库,似乎您需要实例化一个Transport对象(真正引发Exception的东西)确实有一个抛出的异常列表.这是抛出异常的真实对象,而不是BrokerConnection.

你知道回溯模块吗?它可能有助于您将来追踪这些问题.

  • 你甚至不需要`traceback`.只是不要无脑地吞下异常,你会得到一个很好的崩溃,包括完整的追溯和源线. (4认同)