关于python:为什么需要将异常类型放在”except”后面?

Python - Why is an exception type needed to be put after an 'except'?

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
try:
    #dosomething
except Exception:
    #dosomething

为什么在except之后需要"exception"?


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

例如,如果您正在尝试网络操作,但无法解析您尝试访问的网络地址,这可能是由于用户错误,您将希望让用户参与进来,而其他类型的错误只需等待一小段时间即可重试。

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


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

1
2
3
4
try:
    # Do something
except:
    print"Something went wrong."

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

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

例如,如果您绝对不能让您的程序突然退出,那么上面的代码就是您可以做的事情。

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


为什么以及如何捕获异常

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

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

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

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

除非您必须在顶级代码中这样做,否则不应处理意外的异常。

处理顶级代码中的异常

如果不重要,那么在某些情况下,您的代码会抛出一个有点难看的堆栈跟踪,只是对于意外的异常。这是非常有效的,因为代码很简单,并且堆栈跟踪为您提供了一个很好的机会来发现出了什么问题。

如果你必须让你的脚本"表现良好"——你可以捕捉到异常并打印一些好的寻找出问题的借口。

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

在较低级别的代码中,您将捕获所有预期的异常,其余的异常将被忽略,并且被提升到更高的层次,在那里有更好的机会处理它。

如果您没有预期的例外情况,请不要使用tryexcept区块。

打印一些低级代码的借口通常是不合适的(高级代码没有机会t使打印输出静音。

关于你的问题-为什么是except Exception

带有明确提到的异常类型的except是用于预期类型的唯一解决方案例外的情况。不提类型,你就能抓住所有的,这是个坏习惯。除非您是顶级代码。

与往常一样,上述建议也有例外,但其发生频率低于一种。通常是期望值。


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