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." |
然而,这不是一个很好的主意做了很多时间。通过捕获所有异常,甚至不保存名称,您将丢失有关错误所在位置的所有信息。看到
1 2 3 4 | try: # Do something. except Exception, e: print"Encountered error" + str(e) +" during execution. Exiting gracefully." |
例如,如果您绝对不能让您的程序突然退出,那么上面的代码就是您可以做的事情。
编辑:修改了答案,澄清这是个坏主意,尽管可能。
为什么以及如何捕获异常
异常确实有帮助,但是根据代码的不同,它们应该以不同的方式处理。你写。
核心区别是,如果您的代码是顶级代码(处理异常的最后手段)或内部代码。
另一个方面是,如果某些异常是例外或意外的。
如果代码有,则应处理预期的异常(如文件,您尝试使用的文件丢失)。做任何事情的机会。
除非您必须在顶级代码中这样做,否则不应处理意外的异常。
处理顶级代码中的异常如果不重要,那么在某些情况下,您的代码会抛出一个有点难看的堆栈跟踪,只是对于意外的异常。这是非常有效的,因为代码很简单,并且堆栈跟踪为您提供了一个很好的机会来发现出了什么问题。
如果你必须让你的脚本"表现良好"——你可以捕捉到异常并打印一些好的寻找出问题的借口。
处理低级代码(模块、函数)中的异常在较低级别的代码中,您将捕获所有预期的异常,其余的异常将被忽略,并且被提升到更高的层次,在那里有更好的机会处理它。
如果您没有预期的例外情况,请不要使用
打印一些低级代码的借口通常是不合适的(高级代码没有机会t使打印输出静音。
关于你的问题-为什么是带有明确提到的异常类型的
与往常一样,上述建议也有例外,但其发生频率低于一种。通常是期望值。
不同的异常需要不同的修复。例如,当我编写一个python irc bot时,对于对字符串的无效访问,我会有一个异常,except中的代码将尝试纠正它。我也有一个坏插座,可以尝试推断出它为什么会坏,并修复它。我不能有例外,因为它们的固定方式不同