Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python异常层次结构_Python_.net_Exception_Exception Handling - Fatal编程技术网

使用Python异常层次结构

使用Python异常层次结构,python,.net,exception,exception-handling,Python,.net,Exception,Exception Handling,Python提供了广泛的应用程序 在我看来,大多数内置异常都是仅由解释器或Python的内置函数引发的 那么,应该在用户代码中引发哪些内置异常呢?Python2.7和3.x之间的指导是否有所不同 来自.NET,我认为这是一个重要的问题。对于.NET,Microsoft为抛出哪些异常和不抛出哪些异常提供了明确的指导 对于Python,从我所看到的示例中直观地看出,以下内置异常适合在用户代码中提出: 索引器 lookuperor 未实现错误 打字错误 数值误差 …但这些都不是,因为它们都表示一种系

Python提供了广泛的应用程序

在我看来,大多数内置异常都是仅由解释器或Python的内置函数引发的

那么,应该在用户代码中引发哪些内置异常呢?Python2.7和3.x之间的指导是否有所不同

来自.NET,我认为这是一个重要的问题。对于.NET,Microsoft为抛出哪些异常和不抛出哪些异常提供了明确的指导

对于Python,从我所看到的示例中直观地看出,以下内置异常适合在用户代码中提出:

索引器
lookuperor
未实现错误
打字错误
数值误差
…但这些都不是,因为它们都表示一种系统故障:

算术错误
浮点误差
溢流器
零分误差
记忆者
奥瑟罗

对于用户代码中可能引发的异常,Python程序员有很大的灵活性。然而,这种灵活性并不意味着“什么都可以做”。从Python标准库的版本3文档中,本文提供了这种一般性指导

程序员可以提出哪些例外情况:

用户代码可能引发内置异常。这可用于测试 异常处理程序或报告错误条件,就像 口译员提出相同异常的情况;但是 请注意,没有任何东西可以阻止用户代码引发错误 不适当的错误。(强调我的)

关于程序员定义的异常:

可以对内置异常类进行子类化以定义新的异常 例外情况;鼓励程序员从中派生新的异常 类或其子类之一,而不是 . 有关定义异常的更多信息,请参阅 可在Python教程的下找到

子句建议通常不应提出基类异常:

以下异常主要用作其他类的基类 例外情况

基本异常异常算术错误缓冲错误查找错误

相反,根据第条中的指导,通常应提出具体的例外情况:

以下异常是通常提出的异常

断言错误属性错误EOFEROROSError,…,ZeroDivisionError

< P> >,例如,不要引发<强>算术错误>强,请考虑它的一个派生类:<强>浮点PoTrimror < /强>,<强>溢出错误< /强>,和<强>命中错误> <强>。(或者,可能是从算术错误派生的类)

(有关操作错误的详细信息,请参见第条)

最后,在文章中的警告消息上:

警告消息通常在有用的情况下发出 提醒用户程序中的某些条件,其中 (通常)不保证引发异常并终止 节目。例如,您可能希望在程序运行时发出警告 使用过时的模块

用户代码可以通过子类化一个警告类别来定义其他警告类别 属于标准警告类别。必须始终设置警告类别 类的一个子类


你会征求意见或统计数据吗?除此之外,您提供的链接还说:“用户代码可以引发内置异常。这可用于测试异常处理程序或报告错误情况”,就像“解释器引发相同异常的情况;[…]”。这是有道理的,那些由intepreter使用的存在,因为他们无论如何都是需要的。我真的很难找到这个问题的目的。唯一有意义的是在一些大型项目上运行一些grep或其他东西。由于这只是我的观点,所以不要将其作为一个答案添加,但除了可能的弃用警告之外,我只会坚持使用您自己的自定义异常子类化异常(毕竟只有两行代码)@luk32:请查看我的编辑和我提问的动机。我不想让这个问题以意见为基础。@Moritz:您的回答可能会引出另一个问题:“什么时候我应该定义自己的异常类型而不是使用内置的异常类型?”这是一个意见,但是。。。在我看来,这是python,一切都是动态的,就像电子云一样,没有绝对的错误或正确,有更好和更坏的方法,当你应用它们时,结果会是对的或错的,好的或坏的。我不明白,如果您正在实现例如vector类,为什么不抛出算术异常。引文的后半部分说“[…]但请注意,没有什么可以防止用户代码引发不适当的错误。”文档明确指出,用户代码可能会使用异常,甚至可能滥用异常。指南很难遵循,但答案显然比我的更正确。@FilipHaglund By“很难理解,”我不确定您是指Python文档本身,还是指我试图对其进行总结。也就是说,Python文档中给出的指导在我看来比Microsoft为.NET程序员提供的指导更为宽松,也更不精确(关于后者,请参阅我问题中的链接文章)Python文档本身。这个规则非常复杂,我在将来的代码审查中很难记住它。