关于异常处理:在python中为什么要使用除外:

In python why ever use except:

在python中,except Exception as exexcept BaseException as exexcept:相同,但您得到了对异常的引用吗?

据我所知,BaseException是较新的默认catch all。

除此之外,你为什么只想要一个except:条款?


除了pok_mon异常处理*是一个坏主意外,还有几个不同之处。

except Exception:except BaseException:都不会捕获旧式类异常(仅限python 2):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> class Foo(): pass
...
>>> try:
...     raise Foo()
... except Exception:
...     print 'Caught'
...
Traceback (most recent call last):
  File"<stdin>", line 2, in <module>
__main__.Foo: <__main__.Foo instance at 0x10ef566c8>
>>> try:
...     raise Foo()
... except BaseException:
...     print 'Caught'
...
Traceback (most recent call last):
  File"<stdin>", line 2, in <module>
__main__.Foo: <__main__.Foo instance at 0x10ef56680>
>>> try:
...     raise Foo()
... except:
...     print 'Caught'
...
Caught

因为旧样式对象不是从BaseExceptionException派生的。这是一个很好的理由,在任何情况下都不要使用不源自Exception的自定义异常。

其次,有三个例外,它们来自于BaseException,而不是来自Exception;在大多数情况下,您不想抓住这些例外。SystemExitKeyboardInterruptGeneratorExit不是您希望在异常处理的正常过程中捕获的异常。如果你使用except BaseException:,你会抓住这些,except Exception不会。

*pok_mon异常处理,因为你要抓住他们。


这三者的区别在于:

  • except捕捉一切,包括系统退出,如KeyboardInterrupt等;
  • except Exception[ as ex]将捕获Exception的任何子类,这些子类应该是所有用户定义的异常,以及所有内置的非系统退出的异常;以及
  • 以东十一〔七〕会像赤身露体的以东十一〔三〕一样,抓住一切。
  • 一般来说,我建议使用2。(理想情况下作为回退,在捕捉到特定的/"预期的"错误之后),因为这允许那些系统退出异常渗透到顶层。如你所说,as ex部分为2。和3。允许您在处理错误时检查错误。

    这里有一篇关于"例外的邪恶"的有用文章。


    如果你真的不在乎失败的原因或信息是什么,你可以使用一个裸的except:。有时,如果您试图访问某些可能存在或不工作的功能,这很有用;如果失败,您计划优雅地降级到其他代码路径。在这种情况下,错误类型或字符串不会影响您将要执行的操作。


    不完全是这样。

    如果您查看了关于内置异常(特别是这个位)的python文档,您将看到从何处继承的异常。如果使用raw except:它将捕获抛出的每个异常,甚至包括您几乎肯定不想捕获的keyboardinterrupt;如果使用except baseexception as exp:捕获baseexception,则会发生同样的情况,因为所有异常都继承自它。

    如果要捕获所有程序运行时异常,则应将exception用作exp:因为它不会捕获要结束程序的异常类型(如keyboardinterrupt)。

    现在,人们会告诉你,以这种方式捕获所有异常是一个坏主意,一般来说,它们是正确的;但是,例如,如果您有一个程序处理大量数据,那么在发生异常时,您可能会理所当然地希望它不退出。只要您正确处理异常(即,记录它并确保用户看到发生了异常),但决不只是通过;如果您的程序产生了您不知道的错误,它确实会做一些奇怪的事情!


    Aside from that why would you ever want just an except: clause?

    简短的回答:你不想这样。

    更长的回答:使用一个裸的except:会降低区分异常的能力,甚至更难控制异常对象。所以你通常使用except ExceptionType as e:的形式。