首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中使用try-except else是一种好的实践吗?

在Python中使用try-except else是一种好的实践吗?
EN

Stack Overflow用户
提问于 2013-04-22 09:44:52
回答 6查看 289.2K关注 0票数 510

在Python中,我经常看到这样的代码块:

代码语言:javascript
复制
try:
   try_this(whatever)
except SomeException as exception:
   #Handle exception
else:
   return something

try-except-else存在的原因是什么?

我不喜欢这种编程,因为它使用异常来执行流控制。然而,如果它被包含在语言中,那么它一定有一个很好的理由,不是吗?

我的理解是,异常不是errors,它们只应该用于异常情况(例如,我尝试将文件写入磁盘,但没有更多空间,或者我可能没有权限),而不是用于流量控制。

通常,我处理异常的方式如下:

代码语言:javascript
复制
something = some_default_value
try:
    something = try_this(whatever)
except SomeException as exception:
    #Handle exception
finally:
    return something

或者如果我真的不想在发生异常时返回任何内容,那么:

代码语言:javascript
复制
try:
    something = try_this(whatever)
    return something
except SomeException as exception:
    #Handle exception
EN

回答 6

Stack Overflow用户

发布于 2013-04-22 09:47:55

Python并不认同异常应该只在异常情况下使用的想法,事实上,这种习惯用法是'ask for forgiveness, not permission'。这意味着使用异常作为流程控制的常规部分是完全可以接受的,并且实际上是鼓励的。

这通常是一件好事,因为以这种方式工作有助于避免一些问题(作为一个明显的例子,竞争条件通常被避免),并且它倾向于使代码更具可读性。

假设你有这样一种情况,你接受了一些需要处理的用户输入,但却有一个已经处理过的默认值。try: ... except: ... else: ...结构使得代码的可读性非常好:

代码语言:javascript
复制
try:
   raw_value = int(input())
except ValueError:
   value = some_processed_value
else: # no error occured
   value = process_value(raw_value)

与它在其他语言中的工作方式进行比较:

代码语言:javascript
复制
raw_value = input()
if valid_number(raw_value):
    value = process_value(int(raw_value))
else:
    value = some_processed_value

注意它的优点。不需要检查值是否有效并单独解析它,它们只需完成一次。代码也遵循更符合逻辑的顺序,主代码路径是第一个,然后是“如果它不工作,执行此操作”。

这个例子自然有点做作,但它显示了这种结构的用例。

票数 43
EN

Stack Overflow用户

发布于 2018-08-25 13:04:03

请参见下面的示例,它说明了关于try-except else-finally的所有内容:

代码语言:javascript
复制
for i in range(3):
    try:
        y = 1 / i
    except ZeroDivisionError:
        print(f"\ti = {i}")
        print("\tError report: ZeroDivisionError")
    else:
        print(f"\ti = {i}")
        print(f"\tNo error report and y equals {y}")
    finally:
        print("Try block is run.")

实现它,然后过来:

代码语言:javascript
复制
    i = 0
    Error report: ZeroDivisionError
Try block is run.
    i = 1
    No error report and y equals 1.0
Try block is run.
    i = 2
    No error report and y equals 0.5
Try block is run.
票数 18
EN

Stack Overflow用户

发布于 2013-04-22 10:31:17

在使用finally块时应该小心,因为它与在try中使用else块不是一回事,除了。不管try的结果如何,finally块都将运行,除非。

代码语言:javascript
复制
In [10]: dict_ = {"a": 1}

In [11]: try:
   ....:     dict_["b"]
   ....: except KeyError:
   ....:     pass
   ....: finally:
   ....:     print "something"
   ....:     
something

每个人都已经注意到,使用else块会使代码更具可读性,并且只有在没有抛出异常时才会运行

代码语言:javascript
复制
In [14]: try:
             dict_["b"]
         except KeyError:
             pass
         else:
             print "something"
   ....:
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16138232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档