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

时间:2014-09-11 16:10:26

标签: 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

3 个答案:

答案 0 :(得分:2)

我经营的一般规则是:

你期望它通过吗?

  • 如果我希望大部分时间都能成功,我会使用例外。
  • 如果我希望大部分时间都会失败,我会用if语句拦截它

如果发生的事情可能会因为失败而导致其他行为中断(或导致系统受损),我总是先进行验证,验证和健全性检查。

但简单的一句话回答:使用异常是非常Pythonic,并不是完全不赞成的。它实际上可以帮助代码更好地阅读,并且正如您所提到的那样,可能存在其他异常类型,将它们分开捕获:

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

答案 1 :(得分:1)

异常不适用于check.it如果您无法处理某些运行时问题,则应将其用作最后一个选项。最有可能在跑步时发现任何意外但预见到的问题。 ex-db错误,I / O设备错误。所以我们没有任何其他选择来处理异常情况,除非进入尝试捕获。

但在你的情况下,你必须使用像 if else 这样的东西来处理比较和做出选择。

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

答案 2 :(得分:0)

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

他们称之为EAFP原则,引用美国计算机科学家和美国海军海军少将Grace Hopper据称said,有时 e asier a sk f orgiveness而不是 p 错误

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