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
或系统退出exceptionSystemExit
, KeyboardInterrupt
和GeneratorExit
:
>>> 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
,而那些你想要被日常使用的东西(那些会被程序员抛出的东西)也会从Exception
inheritance。
有一些例外,如KeyboardInterrupt有所不同。
阅读PEP8 :
一个空的除了:子句将捕获SystemExit和KeyboardInterruptexception,使得用Control-C中断程序变得困难,并且可以掩盖其他问题。 如果要捕获所有发出程序错误的exception,请使用except Exception(除了等价于除BaseException之外的其他exception)。
使用第二种forms给你一个variables(在你的示例e
,基于as
子句进行命名)在except
块范围内,并绑定exception对象,以便在exception中使用信息(types,消息,堆栈跟踪,等等)在一个更加特别定制的庄园中处理exception。
exception意味着错误。 在运行时find错误。处理运行时错误称为exception处理。 它有两个块试试,除了尝试:它是一个块,它只是例外。 除了:它是一个块。 它采取exception和处理例外。 并执行。