使用Python异常层次结构

时间:2015-02-03 15:29:21

标签: python .net exception exception-handling

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

1 个答案:

答案 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类的子类。