Python - 除了'之外,为什么需要在异常类型之后添加异常类型?

时间:2014-07-15 19:05:23

标签: python

当你在python中使用try / except时,为什么需要一个以后命名的异常类型除外?难道只是抓住所有例外情况会更容易吗?

try:
    #dosomething
except Exception:
    #dosomething

为什么'例外'除了以后需要吗?

4 个答案:

答案 0 :(得分:4)

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

try:
    # Do something
except:
    print "Something went wrong."

然而,在很多时候这样做并不是一个好主意。通过捕获所有异常甚至不保存名称,您将丢失有关错误位置的所有信息。只看到Something went wrong.打印出来既无用又令人沮丧。因此,即使您不想单独处理每个例外,您也希望至少保存例外信息。

try:
    # Do something.
except Exception, e:
    print "Encountered error " + str(e) + " during execution. Exiting gracefully."

例如,如果您绝对不能让程序突然退出,则可以执行上述代码。

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

答案 1 :(得分:4)

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

例如,如果您尝试进行网络操作,并且您尝试联系的网络地址无法解决,则可能是由于用户错误造成的,您和#39;我希望让用户参与其中,而其他一些错误可以在短暂的等待后简单地重试。

异常处理中的一个好习惯是只处理代码中任何一点所期望的最窄异常集,并且只捕获那些您确定知道如何处理的异常。一个包罗万象的异常处理程序违反了这个原则。

答案 2 :(得分:1)

为什么以及如何捕获异常

异常确实很有用,但根据代码的不同,它们应以不同的方式处理 你写的。

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

另一方面是,如果某些例外情况例外或意外。

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

除非您必须在顶级代码中执行此操作,否则不应处理意外的异常。

处理顶级代码中的异常

如果没关系,那么在某些情况下,你的代码会抛出一些难看的堆栈跟踪 意外的例外。这通常非常有效,因为代码保持简单,并且 堆栈跟踪让你有机会发现,出了什么问题。

如果你必须制作你的剧本"表现良好" - 你可以抓住异常并打印一些不错的东西 寻找出错的借口。

处理较低级代码(模块,函数)中的异常

在您的低级代码中,您将捕获所有预期的异常,其余的将被忽略 被提升到更高的水平,哪里有更好的机会正确处理它。

如果您没有预期的例外,请不要使用try .. except阻止

从较低级别的代码中打印一些借口大多是不合适的(更高级别的代码没有机会 打印你的打印输出。

您的问题 - 为什么except Exception

带有明确提及的异常类型的

except是用于预期类型的​​唯一解决方案 例外。没有提到类型(或类型),你抓住所有,这是坏习惯 除非你是顶级代码。

与往常一样,上述建议有例外情况,但它们的发生次数少于一次 通常期望。

答案 3 :(得分:0)

不同的例外需要不同的修复。例如,当我编写一个python irc bot时,我会有一个无效访问字符串的例外,而except中的代码会尝试补救它。我还有一个用于坏套接字,试图推断它为什么变坏并修复它。我不能将这些置于一个例外,因为它们的定义不同