使用异常作为检查-这是个好主意吗

  • 本文关键字:好主意 异常 python
  • 更新时间 :
  • 英文 :


我有代码:

    print('Adding user %s...' % user)
    # my own class with method
    sysacts.useradd()
    # check if user exist after been added
    try:
            pwd.getpwnam(user)
            print('Done.')
    except KeyError as e:
            print('ERROR! %s.nExit.' %e)
            sys.exit(1)

但是-我不喜欢,那个用户添加时没有检查。所以-我想用下一个重新制作:

    print('Adding user %s...' % user)
    # check if new user exist before add it
    try:
            pwd.getpwnam(user)
            print('User already present, skipping.')
    # if no user - will return KeyError: 'getpwnam(): name not found: Username'
    except KeyError as e:
            sysacts.useradd()
            print('Done.')

那么,使用KeyError作为这种检查是否正常?KeyError也可能意味着其他错误。

如果没有-在这里检查用户的最佳方式是什么?

例如,在create directory块中,我制作了:

    # create site files directory
    dir = virt_hosts_dir + 'vhosts/' + user + '/' + domain + '/'
    print('nCreating new directory %s' % dir)
    # if no directory - run mkdir
    if not os.path.isdir(dir):
            try:
                    sysacts.mkdir(dir)
                    print('Done.')
            except OSError as e:
                    print('ERROR: %s' %e)
                    sys.exit(2)
    # otherwise - skip
    else:
            print('Directory %s already present, skipping.' % dir)

p.S.CentOS,Python 2.6

我操作的一般规则是:

你希望它通过吗?

  • 如果我期望一个操作在大多数情况下都会成功,我会使用例外
  • 如果我预计一个操作大部分时间都会失败,我会用If语句拦截它

如果有一些事情可能会因为故障而破坏其他操作(或导致系统损坏),我总是首先进行验证、验证和健全性检查。

但一个简单的一句话回答:使用例外是非常Python的,一点也不令人反感。它实际上可能有助于代码更好地阅读,正如您所提到的,可能还有其他异常类型,请分别捕获它们:

try:
    …
except KeyError:
    …
except TypeError:
    …
except Exception:
    …

异常不用于检查。如果您无法处理某些运行时问题,则应将其用作最后一个选项。最有可能的是在跑步时发现任何意外但可预见的问题。ex-db错误,i/o设备错误。因此,除了尝试接球,我们没有任何其他选择来处理异常情况。

但在您的情况下,您必须使用if else之类的方法来处理比较和进行选择。

请记住,您必须在编码中保持代码质量和性能。

Python与世界上大多数其他地方不同,人们实际上鼓励使用异常。

他们称之为EAFP原则,引用了美国计算机科学家、美国海军少将格雷斯·霍珀的话,据称她说,有时eskf狂欢更容易获得p权限

异常在Python中得到了有效的实现,因此使用了很多。例如,Python中的每个for循环都通过内部抛出StopIteration异常来退出。

最新更新