使用Python异常层次结构
Python提供了广泛的应用程序 在我看来,大多数内置异常都是仅由解释器或Python的内置函数引发的 那么,应该在用户代码中引发哪些内置异常呢?Python2.7和3.x之间的指导是否有所不同 来自.NET,我认为这是一个重要的问题。对于.NET,Microsoft为抛出哪些异常和不抛出哪些异常提供了明确的指导 对于Python,从我所看到的示例中直观地看出,以下内置异常适合在用户代码中提出:使用Python异常层次结构,python,.net,exception,exception-handling,Python,.net,Exception,Exception Handling,Python提供了广泛的应用程序 在我看来,大多数内置异常都是仅由解释器或Python的内置函数引发的 那么,应该在用户代码中引发哪些内置异常呢?Python2.7和3.x之间的指导是否有所不同 来自.NET,我认为这是一个重要的问题。对于.NET,Microsoft为抛出哪些异常和不抛出哪些异常提供了明确的指导 对于Python,从我所看到的示例中直观地看出,以下内置异常适合在用户代码中提出: 索引器 lookuperor 未实现错误 打字错误 数值误差 …但这些都不是,因为它们都表示一种系
索引器
lookuperor
未实现错误
打字错误
数值误差
…但这些都不是,因为它们都表示一种系统故障:
算术错误
浮点误差
溢流器
零分误差
记忆者
奥瑟罗
对于用户代码中可能引发的异常,Python程序员有很大的灵活性。然而,这种灵活性并不意味着“什么都可以做”。从Python标准库的版本3文档中,本文提供了这种一般性指导
程序员可以提出哪些例外情况:
用户代码可能引发内置异常。这可用于测试
异常处理程序或报告错误条件,就像
口译员提出相同异常的情况;但是
请注意,没有任何东西可以阻止用户代码引发错误
不适当的错误。(强调我的)
关于程序员定义的异常:
可以对内置异常类进行子类化以定义新的异常
例外情况;鼓励程序员从中派生新的异常
类或其子类之一,而不是
. 有关定义异常的更多信息,请参阅
可在Python教程的下找到
子句建议通常不应提出基类异常:
以下异常主要用作其他类的基类
例外情况
基本异常,异常,算术错误,缓冲错误,查找错误
相反,根据第条中的指导,通常应提出具体的例外情况:
以下异常是通常提出的异常
断言错误,属性错误,EOFEROROSError,…,ZeroDivisionError
< P> >,例如,不要引发<强>算术错误>强,请考虑它的一个派生类:<强>浮点PoTrimror < /强>,<强>溢出错误< /强>,和<强>命中错误> <强>。(或者,可能是从算术错误派生的类)
(有关操作错误的详细信息,请参见第条)
最后,在文章中的警告消息上:
警告消息通常在有用的情况下发出
提醒用户程序中的某些条件,其中
(通常)不保证引发异常并终止
节目。例如,您可能希望在程序运行时发出警告
使用过时的模块
用户代码可以通过子类化一个警告类别来定义其他警告类别
属于标准警告类别。必须始终设置警告类别
类的一个子类
你会征求意见或统计数据吗?除此之外,您提供的链接还说:“用户代码可以引发内置异常。这可用于测试异常处理程序或报告错误情况”,就像“解释器引发相同异常的情况;[…]”。这是有道理的,那些由intepreter使用的存在,因为他们无论如何都是需要的。我真的很难找到这个问题的目的。唯一有意义的是在一些大型项目上运行一些grep或其他东西。由于这只是我的观点,所以不要将其作为一个答案添加,但除了可能的弃用警告之外,我只会坚持使用您自己的自定义异常子类化异常(毕竟只有两行代码)@luk32:请查看我的编辑和我提问的动机。我不想让这个问题以意见为基础。@Moritz:您的回答可能会引出另一个问题:“什么时候我应该定义自己的异常类型而不是使用内置的异常类型?”这是一个意见,但是。。。在我看来,这是python,一切都是动态的,就像电子云一样,没有绝对的错误或正确,有更好和更坏的方法,当你应用它们时,结果会是对的或错的,好的或坏的。我不明白,如果您正在实现例如vector类,为什么不抛出算术异常。引文的后半部分说“[…]但请注意,没有什么可以防止用户代码引发不适当的错误。”文档明确指出,用户代码可能会使用异常,甚至可能滥用异常。指南很难遵循,但答案显然比我的更正确。@FilipHaglund By“很难理解,”我不确定您是指Python文档本身,还是指我试图对其进行总结。也就是说,Python文档中给出的指导在我看来比Microsoft为.NET程序员提供的指导更为宽松,也更不精确(关于后者,请参阅我问题中的链接文章)Python文档本身。这个规则非常复杂,我在将来的代码审查中很难记住它。