Python—为什么需要将异常类型放在';除了';?

Python—为什么需要将异常类型放在';除了';?,python,Python,在python中使用try/except时,为什么需要以except命名异常类型?捕获所有异常不是更容易吗 try: #dosomething except Exception: #dosomething 为什么在except之后需要“Exception”?从纯语法的角度来看,这是可以接受的代码: try: # Do something except: print "Something went wrong." 然而,经常这样做并不是一个好主意。通过捕获所有异

在python中使用try/except时,为什么需要以except命名异常类型?捕获所有异常不是更容易吗

try:
    #dosomething
except Exception:
    #dosomething

为什么在except之后需要“Exception”?

从纯语法的角度来看,这是可以接受的代码:

try:
    # Do something
except:
    print "Something went wrong."
然而,经常这样做并不是一个好主意。通过捕获所有异常,甚至不保存名称,您将丢失有关错误位置的所有信息。仅仅看到
出了问题。
打印出来既没用又令人沮丧。因此,即使您不想单独处理每个异常,您也希望至少保存异常信息

try:
    # Do something.
except Exception, e:
    print "Encountered error " + str(e) + " during execution. Exiting gracefully."
例如,如果绝对不能让程序突然退出,则可以使用上面的代码


编辑:更改答案以澄清这是一个坏主意,尽管可能。

因为您可能以不同的方式处理不同的异常

例如,如果您正在尝试网络操作,而您尝试访问的网络地址无法解析,这可能是由于用户错误,您希望让用户参与,而其他类型的错误可以在短时间等待后重试


在异常处理方面,一个很好的做法是只处理代码中任何一点上期望的最窄的异常集,并且只捕获那些您确信知道如何处理的异常。捕获所有异常处理程序违反了这一原则。

不同的异常需要不同的修复。例如,当我编写一个python irc bot时,我会遇到一个对字符串无效访问的异常,except中的代码会试图纠正它。我也有一个坏插座,将试图推断出它为什么坏了,并修复它。我不能将它们放在一个异常下,因为它们的修复方式不同

为什么以及如何捕获异常 异常确实很有用,但根据代码的不同,应以不同的方式处理它们 你写

核心区别是,如果您的代码是顶级代码(处理异常的最后手段)或内部代码

另一个方面是,如果某些异常是例外或意外的

如果代码有错误,则应处理预期的异常(例如,您尝试使用的文件丢失) 一个做任何事情的机会

除非必须在顶级代码中处理意外异常,否则不应处理意外异常

处理顶级代码中的异常 如果这不重要,那么在某些情况下,您的代码会抛出一个有点难看的堆栈跟踪,简单地说 关于意外的例外情况。这通常是非常有效的,因为代码保持简单,并且 堆栈跟踪为您提供了一个很好的机会来发现问题所在

如果你必须让你的脚本“表现良好”——你可以捕捉异常并打印一些漂亮的脚本 为错误寻找借口

处理低级代码(模块、函数)中的异常 在较低级别的代码中,您将捕获所有预期的异常,其余的将被忽略并删除 被提升到更高的层次,哪里有更好的机会正确处理它

如果没有预期的异常,请不要使用
尝试
<代码>除了

从低级代码中打印一些借口通常是不合适的(高级代码没有机会) Don’不要让打印出来的内容静音

回答您的问题-为什么
例外情况除外
except
明确提到的异常类型是用于预期类型的唯一解决方案 如果不提及类型(或多个类型),您将捕获所有异常,这是一个坏习惯 除非您使用的是顶级代码

与往常一样,上述建议也有例外情况,但发生的频率低于一次
通常预期。

处理所有异常会使调试成为一场噩梦,尤其是在内存或堆栈出现问题时。