except:除了Exception之外的区别:在Python中

下面的代码片断都做同样的事情。 他们捕获每个exception并执行except:代码块中的代码

代码段1 –

 try: #some code that may throw an exception except: #exception handling code 

代码段2 –

 try: #some code that may throw an exception except Exception as e: #exception handling code 

这两个构造究竟有什么不同?

在第二个中,您可以访问exception对象的属性:

 >>> def catch(): ... try: ... asd() ... except Exception as e: ... print e.message, e.args ... >>> catch() global name 'asd' is not defined ("global name 'asd' is not defined",) 

但它不捕获BaseException或系统退出exceptionSystemExitKeyboardInterruptGeneratorExit

 >>> def catch(): ... try: ... raise BaseException() ... except Exception as e: ... print e.message, e.args ... >>> catch() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in catch BaseException 

除了一个裸露的除外:

 >>> def catch(): ... try: ... raise BaseException() ... except: ... pass ... >>> catch() >>> 

有关详细信息,请参阅文档的“ 内置 例外”部分以及本教程的“ 错误和例外”部分。

 except: 

接受所有例外,而

 except Exception as e: 

只接受你想要捕捉的exception。

下面是一个你不打算抓住的例子:

 >>> try: ... input() ... except: ... pass ... >>> try: ... input() ... except Exception as e: ... pass ... Traceback (most recent call last): File "<stdin>", line 2, in <module> KeyboardInterrupt 

第一个沉默KeyboardInterrupt

这里有一个快速列表:

 issubclass(BaseException, BaseException) #>>> True issubclass(BaseException, Exception) #>>> False issubclass(KeyboardInterrupt, BaseException) #>>> True issubclass(KeyboardInterrupt, Exception) #>>> False issubclass(SystemExit, BaseException) #>>> True issubclass(SystemExit, Exception) #>>> False 

如果你想抓住这些,最好做

 except BaseException: 

指出你知道你在做什么。


所有的exception都来自于BaseException ,而那些你想要被日常使用的东西(那些会被程序员抛出的东西)也会从Exceptioninheritance。

有一些例外,如KeyboardInterrupt有所不同。

阅读PEP8 :

一个空的除了:子句将捕获SystemExit和KeyboardInterruptexception,使得用Control-C中断程序变得困难,并且可以掩盖其他问题。 如果要捕获所有发出程序错误的exception,请使用except Exception(除了等价于除BaseException之外的其他exception)。

使用第二种forms给你一个variables(在你的示例e ,基于as子句进行命名)在except块范围内,并绑定exception对象,以便在exception中使用信息(types,消息,堆栈跟踪,等等)在一个更加特别定制的庄园中处理exception。

exception意味着错误。 在运行时find错误。处理运行时错误称为exception处理。 它有两个块试试,除了尝试:它是一个块,它只是例外。 除了:它是一个块。 它采取exception和处理例外。 并执行。