ZeroDivisionError
,NameError
,TypeError
),而不是“Exception”(例如ZeroDivisionException
,NameException
,TypeException
)?我来自Java背景,并最近开始学习Python,因此这很令人困惑,因为在Java中有错误和异常之间的区别。
在Python中是否也有区别?
你不需要在类名中加上“Class”,也不需要在变量名中加上“_variable”。就像你不会使用“Exception”这个词命名异常一样。名称应该反映对象的含义,“错误”是大多数异常的含义。
并非所有异常都是错误。SystemExit,KeyboardInterrupt,StopIteration和GeneratorExit都是异常,而不是错误。实际错误中的“错误”表明了差异。
“错误”比“异常”更短。那可以节省代码宽度中的几个字符,而不会丢失任何含义。这会带来一些差异。
我认为这个惯例来自于PEP 8 - Python代码风格指南:
异常名称
由于异常应该是类,因此这里适用类命名约定。但是,如果异常确实是一个错误,您应该在异常名称上使用后缀“Error”。
Python在这方面与Java非常相似。但是,Python的异常应该与Java的Throwable进行比较。
就像Throwables有各种各样的类型 - 错误(Error)、运行时异常(RuntimeException)和(已检查的)异常(Exception)一样,Python也有它们(尽管没有已检查的异常)。
至于语言本身,错误是特殊的,因此继承层次结构并不奇怪。
我并不特别喜欢“异常”这个名称。异常不仅用于异常情况(就像希望出现错误一样),而且还用于跳出控制流程。因为这就是异常所做的;它跳出正常的控制流程到一个标记点。有点像goto,但更精细。
话虽如此,每当您遇到无法找到合适的返回值的情况时,您倾向于使用异常。无论是在Python中还是在Java中都是如此。
Exception
结尾,这种区分将不可能实现。DeprecationWarning
和ImportWarning
。或者通常我会这样做,但我会例外处理
这通常会导致错误,但我们将进行异常处理,并执行某些过程。
细节:异常与错误:
https://docs.python.org/2/tutorial/errors.html
在执行过程中检测到的错误被称为“异常”,并不是无条件致命的。其实只是命名的不同。在Java中,你有java.lang.Error
与其他Throwable
不同,因为这些类型的错误需要是未经检查的。在Python中,所有的异常都是未经检查的,所以这种区别有点无意义。
class ExceptionHandlingException extends RuntimeException
这样的东西,那真的太难读了。 - Esko