【问题标题】:Python exceptions - a function with try...except clause in a loopPython 异常 - 循环中带有 try...except 子句的函数
【发布时间】:2014-08-28 23:46:29
【问题描述】:

我经常遇到这样的情况:

import os

for i in range(10):
    os.mkdir(i)

但是,有时目录已经存在,在这种情况下 os.mkdir 会抛出 OSError。发生这种情况时,我只想让它跳过循环的其余部分并移动到 i 的下一次迭代,所以我经常这样写:

for i in range(10):
    try:
        os.mkdir(i)
    except OSError:
        continue

但是,我真正、真正想要的是一个封装该行为的函数。像这样的:

def custom_mkdir(directory):
    try:
        os.mkdir(directory)
    except OSError:
        continue

这样我就可以有一些这样的代码:

for i in range(10):
    custom_mkdir(i)

如果目录不存在则创建目录,但如果存在则跳到 for 循环的下一个交互。

但是,continue 语句不能以这种方式包含在函数中。那么我如何在不求助于的情况下获得预期的行为:

for i in range(10):
    try:
        custom_mkdir(i)
    except OSError:
        continue

哪种情况比第一种情况更糟?

【问题讨论】:

    标签: python exception


    【解决方案1】:

    好吧,如果循环内没有其他事情发生,你可以这样做:

    def custom_mkdir(directory):
        try:
            os.mkdir(directory)
        except OSError:
            pass
    
    for i in range(10):
        custom_mkdir(i)
    

    如果custom_mkdir 下面实际上有更多代码,我认为你能做的最好的就是:

    def custom_mkdir(directory):
        try:
            os.mkdir(directory)
            return True
        except OSError:
            return False
    
    for i in range(10):
        if not custom_mkdir(i):
           continue
    

    for i in range(10):
        if custom_mkdir(i):
            # The rest of the logic in here
    

    至少比原版更简洁一些。

    【讨论】:

      【解决方案2】:

      OSErrorcustom_mkdir 捕获时,您的函数真正 想要做的就是什么都不做。所以,什么都不做:

      def custom_mkdir(directory):
          try:
              os.mkdir(directory)
          except OSError:
              pass
      

      【讨论】:

      • 这并不能帮助调用者决定要做什么。
      • @JoshSmeaton:调用者需要决定做什么吗?在问题中发布的代码中,它没有。
      • 是的,调用者会这样做。这就是问题的重点。如果mkdir 失败,OP 想要continue。他们只是想封装 try/except 以使循环看起来更整洁。
      • OP 明确表示,他们想要continue。您应该假设在 mkdir 调用之后发生了更多事情,否则continuing 毫无意义 - 他们只会让循环用完。
      • 是的,这个问题有点含糊。根据示例,仅使用 pass 即可。但是,如果pass 实际上 适合他/她的用例,那么 OP 实际上会问这个问题会很奇怪。不过,我猜他/她可能只是不知道或没想过使用pass
      【解决方案3】:

      只返回一个布尔值:

      def custom_mkdir(directory):
          try:
              os.mkdir(directory)            
          except OSError:
              return False
          return True
      
      for i in range(10):
          if not custom_mkdir(directory): continue
      

      【讨论】:

        【解决方案4】:

        代码:

        def cusyom_mkdir(diectory):
        try:
            os.mkdir(directory)
            return True
        except OSError:
            return False
        

        status = map(cusyom_mkdir, [i for i in range(10)])

        def cusyom_mkdir(diectory):
        try:
            os.mkdir(directory)
            return True, directory
        except OSError:
            return False, directory
        

        status = map(cusyom_mkdir, [i for i in range(10)])

        可以看到目录创建成功目录创建失败

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多