什么时候需要在Python中的try..except中添加`else`子句?

时间:2009-08-22 13:41:42

标签: python exception

当我使用异常处理在Python中编写代码时,我可以编写如下代码:

try:
    some_code_that_can_cause_an_exception()
except:
    some_code_to_handle_exceptions()
else:
    code_that_needs_to_run_when_there_are_no_exceptions()

这与以下内容有何不同:

try:
    some_code_that_can_cause_an_exception()
except:
    some_code_to_handle_exceptions()

code_that_needs_to_run_when_there_are_no_exceptions()

在这两种情况下,code_that_needs_to_run_when_there_are_no_exceptions()将在没有异常时执行。有什么区别?

8 个答案:

答案 0 :(得分:9)

在第二个示例中,当您执行有异常然后处理它时,将运行code_that_needs_to_run_when_there_are_no_exceptions(),继续执行除外。

所以......

在这两种情况下,code_that_needs_to_run_when_there_are_no_exceptions()将在没有异常时执行,但后者将在有异常时执行。

在CLI上试试这个

#!/usr/bin/python

def throws_ex( raise_it=True ):
        if raise_it:
                raise Exception("Handle me")

def do_more():
        print "doing more\n"

if __name__ == "__main__":
        print "Example 1\n"
        try:
                throws_ex()
        except Exception, e:
                # Handle it
                print "Handling Exception\n"
        else:
                print "No Exceptions\n"
                do_more()

        print "example 2\n"
        try:
                throws_ex()
        except Exception, e:
                print "Handling Exception\n"
        do_more()

        print "example 3\n"
        try:
                throws_ex(False)
        except Exception, e:
                print "Handling Exception\n"
        else:
                do_more()

        print "example 4\n"
        try:
                throws_ex(False)
        except Exception, e:
                print "Handling Exception\n"
        do_more()

将输出

  

示例1

     

处理例外

     

示例2

     

处理例外

     

做更多

     

示例3

     

做更多

     

例4

     

做更多

你得到了这个想法,玩耍有异常,冒泡等等!破解命令行和VIM!

答案 1 :(得分:7)

实际上,在第二个片段中,最后一行始终执行。

你可能意味着

try:
    some_code_that_can_cause_an_exception()
    code_that_needs_to_run_when_there_are_no_exceptions()
except:
    some_code_to_handle_exceptions()

我相信你可以使用else版本,如果它使代码更具可读性。如果你不想从{{{}}中捕获异常,你可以使用else版本。 {1}}。

答案 2 :(得分:6)

示例1:

try:
    a()
    b()
except:
    c()

此处,b()仅在a()未抛出时运行,但except块也将捕获b() ,你可能不想要。一般规则是:只捕获您知道可能发生的异常(并且有一种处理方式)。因此,如果您不知道b()是否会抛出,或者如果您无法通过捕获b()引发的异常而做任何有用的事情,那么不会放置b() } try:

示例2:

try:
    a()
except:
    c()
else:
    b()

此处,b()仅在a()未抛出时运行,但b()抛出的任何异常都不会在此处捕获并将继续向上传播。这通常是你想要的。

示例3:

try:
    a()
except:
    c()

b()

此处,b()始终运行,即使a()没有抛出任何内容。当然,这也非常有用。

答案 3 :(得分:4)

您的原始代码几乎是正确的。这是完整的治疗方法:

try:
    some_code_that_can_cause_an_exception()
except:
    some_code_to_handle_exceptions()
else:
    code_that_needs_to_run_when_there_are_no_exceptions()

code_that_runs_whether_there_was_an_exception_or_not()

答案 4 :(得分:2)

虽然Ned Batchelder的回应适合OP,但我想稍微建立一下。另外,我不能回复作为对Mk12评论的评论(因为我"只有#34;有49个代表,而不是50个,去图)。所以我的贡献是:

try:
    code_that_can_cause_an_exception()
except ParticularException:
    code_to_handle_the_particular_exception()
except:
    code_to_handle_all_other_exceptions()
else:
    code_to_run_when_there_are_no_exceptions_and_which_should_not_be_run_after_except_clauses()
finally:
    code_to_run_whether_there_was_an_exception_or_not_even_if_the_program_will_exit_from_the_try_block()

code_to_run_whether_there_was_an_exception_or_not_if_execution_reaches_here()

答案 5 :(得分:1)

根据docs ...

“如果控制流出try子句的末尾,则执行可选的else子句.7。else子句中的异常不由前面的except子句处理。”

请将此基本示例视为您的答案

try:
  print("Try with Exception")
  print(sys.path)
except NameError:
  print "Exception"
else:
  print "Else"

print("Out of try/except block")

try:
  print("Try without Exception")
except NameError:
  print "Exception"
else:
  print "Else is now executed"

print("Out of try/except finally")

了解未发生异常时如何执行else。

答案 6 :(得分:1)

我使用try:.. except:.. else:很多!

这是模式:try..except应该只跨越我预期异常的一行代码。然后除了回退/默认处理,否则:做我真正想做的事情(没有例外=>继续做我想要的)。

一个简单的例子:

   # Exhibit 1
   data_paths = []
   try:
       from . import version_subst
   except ImportError:
       first_datadir = "./data"
   else:
       first_datadir = os.path.join(version_subst.DATADIR, PACKAGE_NAME)


# Exhibit 2
for attr in attrs:
    try:
        obj = getattr(plugin, attr)
    except AttributeError, e:
        if warn:
            pretty.print_info(__name__, "Plugin %s: %s" % (plugin_name, e))
        yield None
    else:
        yield obj

答案 7 :(得分:0)

我没有长时间使用Python,但我尝试在try块中处理特定异常,并使用else来处理我可能没想到的“其他”异常,类似于C / C ++ default块中的switch块。这也适用于else吗?