【问题标题】:Python: Multiple try except blocks in one?Python:除了块之外的多次尝试?
【发布时间】:2015-08-31 07:22:27
【问题描述】:

有没有一种简洁的方法可以在 try 块中添加多个命令,以便它基本上尝试每一行而不会在一个命令产生错误时立即停止?

基本上我想替换这个:

try:
   command1
except:
   pass
try:
   command2
except:
   pass
try:
   command3
except:
   pass

用这个:

try all lines:
  command1
  command2
  command3
except:
  pass

定义一个列表以便我可以遍历命令似乎是一个糟糕的解决方案

【问题讨论】:

  • 您可以创建一个单独的函数来分别调用每个命令并在其中处理异常处理。
  • 相同问题的答案在这里:stackoverflow.com/questions/13874666/…
  • @Plug4 不是重复的;如果链中的前一个命令失败,该问题只希望执行后续命令。询问者想要执行后续命令,而不管前面的命令是成功还是失败。
  • @ColonelThirtyTwo 我的错!它是不同的。好点
  • 列出要执行的函数并循环遍历它们是一个 ok 解决方案......也许它看起来很糟糕的原因是因为它在某种程度上是一种反模式只需从整个代码块中抛出异常。如果command2 需要command1 的结果,而command1 抛出异常怎么办?也许您可以更详细地描述这些命令的作用,以便我们可以评论在这里大规模忽略异常是否有意义。

标签: python try-catch except


【解决方案1】:

实际上,您的第二选择正是您想要的帽子。一旦任何命令引发异常,它就会通过异常,并包括哪个异常以及它发生在哪一行的信息。如果您愿意,您可以捕获不同的异常并执行不同的操作

try:
  command1
  command2
except ExceptionONe:
  pass
except Exception2:
  pass
except:
  pass   # this gets anything else.

【讨论】:

  • 如果command1 抛出,command2 将不会执行。 OP 希望 command2 执行,即使 command1 抛出。与 Linuxios 的回答相同。
  • 那么您可能想在上面的答案中使用函数方法。你可以通过定义一个装饰器让它更流畅一些,但即使这样也好不了多少。
【解决方案2】:

您可以在同一个 except 语句中排除多个错误。例如:

   try:        
    cmd1
    cmd2
    cmd3    
   except:
      pass

或者你可以创建一个函数并通过错误和cmd传递

def try_except(cmd):
    try:
        cmd
    except:
        pass

【讨论】:

    【解决方案3】:

    我会说这是一种设计气味。消除错误通常是个坏主意,尤其是当您要消除很多错误时。但我会给你怀疑的好处。

    您可以定义一个包含try/except 块的简单函数:

    def silence_errors(func, *args, **kwargs):
        try:
            func(*args, **kwargs)
        except:
            pass # I recommend that you at least log the error however
    
    
    silence_errors(command1) # Note: you want to pass in the function here,
    silence_errors(command2) # not its results, so just use the name.
    silence_errors(command3)
    

    这很有效,看起来相当干净,但你需要在任何地方不断重复silence_errors

    列表解决方案没有任何重复,但看起来有点糟糕,不能轻易传入参数。但是,您可以从程序中的其他位置读取命令列表,这可能会有所帮助,具体取决于您正在执行的操作。

    COMMANDS = [
        command1,
        command2,
        command3,
    ]
    
    for cmd in COMMANDS:
        try:
            cmd()
        except:
            pass
    

    【讨论】:

      【解决方案4】:

      实际上,我认为他想要更好的方式:

      try:
         command1
      except:
         try:
            command2
         except:
            try:
               command3
            except:
               pass
      

      【讨论】:

        【解决方案5】:

        我用不同的方式,用一个新的变量:

        continue_execution = True
        try:
            command1
            continue_execution = False
        except:
            pass
        if continue_execution:
            try:
                command2
            except:
                command3
        

        要添加更多命令,您只需添加更多这样的表达式:

        try:
            commandn
            continue_execution = False
        except:
            pass
        

        【讨论】:

          猜你喜欢
          • 2011-08-31
          • 1970-01-01
          • 1970-01-01
          • 2021-09-22
          • 2013-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多