Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用else子句处理异常_Python - Fatal编程技术网

Python 用else子句处理异常

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

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(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子句中。你可以把它搬出去