Python提供了广泛的list of built-in exceptions。
在我看来,大多数内置异常只能由解释器或Python的内置函数引发。
那么,应该在用户代码中引发哪些内置异常? Python 2.7和3.x之间的指导是否有所不同?
来自.NET,我认为这是一个重要的问题。对于.NET,Microsoft提供了明确的指导,指出要抛出的异常和 不 以抛出Using Standard Exception Types。
对于Python,在我看来,从我看到的示例中,以下内置异常适合于引发用户代码:
IndexError
LookupError
NotImplementedError
TypeError
ValueError
...但是这些不,因为每个都表示一种系统故障:
ArithmeticError
FloatingPointError
OverflowError
ZeroDivisionError
MemoryError
OSError
答案 0 :(得分:1)
Python程序员在可以从用户代码中引发的异常方面具有很大的灵活性。然而,这种灵活性并不代表任何事情都会发生。"从Python标准库的第3版文档中,文章5. Built-in Exceptions提供了此一般指导。
程序员可以提出什么例外:
用户代码可能会引发内置异常。这可以用来测试一个 异常处理程序或报告错误条件“就像” 口译员提出同样的例外情况;但 请注意没有什么可以防止用户代码引发 不恰当的错误。 (强调我的)
关于程序员定义的例外:
可以对内置异常类进行子类化以定义新的 例外情况;鼓励程序员从中派生新的例外 Exception类或其子类之一,而不是来自 BaseException。有关定义例外的更多信息是 可在User-defined Exceptions下的Python教程中找到。
条款5.1. Base classes表明基类异常通常应该 :
以下异常主要用作其他异常的基类 异常。
BaseException ,异常, ArithmeticError , BufferError , LookupError
相反,根据条款5.2. Concrete exceptions中的指导,具体例外 应该通常会被提出:
以下例外是通常会引发的例外情况。
AssertionError , AttributeError , EOFError ,... OSError ,..., ZeroDivisionError 强>
因此,举例来说,不要提出 ArithmeticError ,而应考虑提升其派生类之一: FloatingPointError , OverflowError 和 ZeroDivisionError 即可。 (或者,也许是您从 ArithmeticError 派生的类。)
(有关 OSError 的详情,请参阅条款5.2.1. OS exceptions。)
最后,来自文章29.5. warnings — Warning control的警告消息:
警告消息通常在有用的情况下发出 提醒用户程序中的某些条件,其中包含该条件 (通常)不保证提出异常并终止 程序。例如,人们可能希望在程序时发出警告 使用过时的模块。
...
用户代码可以通过子类化一个来定义其他警告类别 标准警告类别。警告类别必须始终是 Warning类的子类。