Python 用else子句处理异常
Python教程 试一试。。。except语句有一个可选的else子句,该子句, 如果存在,则必须遵守除条款外的所有条款。这对于编写代码很有用 如果try子句没有引发异常,则必须执行。 例如:Python 用else子句处理异常,python,Python,Python教程 试一试。。。except语句有一个可选的else子句,该子句, 如果存在,则必须遵守除条款外的所有条款。这对于编写代码很有用 如果try子句没有引发异常,则必须执行。 例如: for arg in sys.argv[1:]: try: f = open(arg, 'r') except IOError: print 'cannot open', arg else: print arg, 'has', len
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except IOError:
print 'cannot open', arg
else:
print arg, 'has', len(f.readlines()), 'lines'
f.close()
使用else子句比添加额外代码要好
添加到try子句,因为它避免意外捕获异常
这不是由受try保护的代码引发的。。。除了
声明
问题1> After 阅读上述文档,我仍然不明白为什么不能简单地将代码从else子句移动到try子句
问题2>try子句如何意外捕获异常,因为所有捕获都是在except子句中完成的,对吗?这两个问题的答案相似 如果将代码移动到try子句,则无法确定异常来自何处。因此,如果您有另一行代码产生意外的IOError,您可以在没有问题的地方结束搜索
因此,为了更好地分离代码,您希望尽可能简化代码中的行,尝试使捕获尽可能特别。两个问题的答案相似 如果将代码移动到try子句,则无法确定异常来自何处。因此,如果您有另一行代码产生意外的IOError,您可以在没有问题的地方结束搜索
因此,为了更好地分离代码,您希望尽可能简化代码中的行,尝试使捕获尽可能特殊。您可以将
else
代码放在try
套件中,但随后您将捕获可能在那里引发的任何异常。如果您不打算发生这种情况,那么这将是“意外的”,因此您链接到的文档的措辞也是如此
最佳实践是在
try
块中放入尽可能少的代码,这样当出现错误时,您就知道是什么操作导致了错误,并可以适当地处理它。如果在try
块中有五行代码,并且只期望其中一行引发异常,那么当异常发生在您不期望的行中时,您的异常处理代码将准备不足。在这种情况下,最好让异常被引发,而不是以错误的方式处理它。您可以将else
代码放在try
套件中,但这样您就可以捕获可能在那里引发的任何异常。如果您不打算发生这种情况,那么这将是“意外的”,因此您链接到的文档的措辞也是如此
最佳实践是在
try
块中放入尽可能少的代码,这样当出现错误时,您就知道是什么操作导致了错误,并可以适当地处理它。如果在try
块中有五行代码,并且只期望其中一行引发异常,那么当异常发生在您不期望的行中时,您的异常处理代码将准备不足。在这种情况下,最好让异常被引发,而不是以错误的方式处理它。如果您将代码从else移动到try中,那么这将成为可能引发异常的“关键路径”的一部分。如果f.readlines()引发某种异常(可能是由于磁盘上的坏扇区导致读取文件时出现I/O错误),则该错误将与当前捕获的一个错误合并。(从技术上讲,“无法打开”错误消息在这一点上是错误的……因为在以后读取文件失败时,打开文件可能会成功;事实上,在处理文件时,打开文件必须成功,否则甚至可能会出现I/O错误)
通常,您会使用一种更类似于:
foo = None
try:
# some code to access/load/initialize foo from an external source
except ...:
# handle various types of file open/read, database access, etc errors
else:
foo = something
。。。因此,您随后可以运行代码并简单地检查foo是否为None,然后使用它或
以您认为合适的任何方式解决它的不可用性。如果您将代码从else移到try中,那么这将成为“关键路径”的一部分,可能引发异常。如果f.readlines()引发某种异常(可能是由于磁盘上的坏扇区导致读取文件时出现I/O错误),则该错误将与当前捕获的一个错误合并。(从技术上讲,“无法打开”错误消息在这一点上是错误的……因为在以后读取文件失败时,打开文件可能会成功;事实上,在处理文件时,打开文件必须成功,否则甚至可能会出现I/O错误) 通常,您会使用一种更类似于:
foo = None
try:
# some code to access/load/initialize foo from an external source
except ...:
# handle various types of file open/read, database access, etc errors
else:
foo = something
。。。因此,您随后可以运行代码并简单地检查foo是否为None,然后使用它或
以您认为合适的方式解决它不可用的问题。1)当然,您可以将代码从else子句移到try子句中。您可以将其完全移出try块,但这允许额外的灵活性和对代码的进一步调制。另外,可能是由于捕捉到错误而导致的特殊性。您可以列出可能发生的所有不同异常,每个异常都有不同的语句。else子句中的内容只有在try块中的最后一行执行之后,没有引发异常时才会发生。e、 g.打印成功的返回消息。
此外,try子句在垃圾收集管理和错误跟踪方面增加了一些额外的CPU开销,因此try子句之外的任何内容都不会以相同的方式受到保护,并且可能会运行得更高效
2) 错误捕获非常具体。e、 g.只有在运行f=open(arg,'r')
行时引发IOError时,才会运行上述示例中的except子句。如果要捕获任何形式的异常,请使用exception:
1)当然,您可以将代码从else子句移到try子句中。你可以把它搬出去