当我使用异常处理在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()
将在没有异常时执行。有什么区别?
答案 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
吗?