【问题标题】:Make python code continue after exception使python代码在异常后继续
【发布时间】:2013-09-25 00:34:29
【问题描述】:

我正在尝试从符合特定条件的文件夹中读取所有文件。一旦出现异常,我的程序就会崩溃。即使出现异常,我也试图继续,但它仍然停止执行。

这是我几秒钟后得到的。

error <type 'exceptions.IOError'>

这是我的代码

import os 
path = 'Y:\\Files\\'
listing = os.listdir(path)
try:
    for infile in listing:
        if infile.startswith("ABC"):
            fo = open(infile,"r")
            for line in fo:
                if line.startswith("REVIEW"):
                    print infile
            fo.close()
except:
    print "error "+str(IOError)
    pass

【问题讨论】:

  • “即使出现异常,我也会尝试继续”- 除非您对如何继续程序有明确的计划,否则永远不要这样做。假设您在 except: 块之后的代码依赖于文件内容,那么在 IO 错误后继续是一个坏主意。让异常使程序崩溃,这样您就可以真正注意到并解决根本问题。
  • 假设,我在脚本中有两个独立的任务。即使我在第一个任务中遇到异常,我也想继续监视第二个任务。在那种情况下,什么是理想的? def task_1(): # DO SOMETHING def task_2(): # DO SOMETHING ELSE try: task_1() except: #Print ERROR MSG try: task_2() except: #Print ERROR MSG

标签: python


【解决方案1】:

将您的try/except 结构更向内。否则当你得到一个错误时,它会破坏所有的循环。

也许在第一个 for 循环之后,添加 try/except。然后,如果出现错误,它将继续处理下一个文件。

for infile in listing:
    try:
        if infile.startswith("ABC"):
            fo = open(infile,"r")
            for line in fo:
                if line.startswith("REVIEW"):
                    print infile
            fo.close()
    except:
        pass

这是一个完美的例子,说明了为什么您应该在此处使用with 语句来打开文件。当您使用open() 打开文件但捕获到错误时,该文件将永远保持打开状态。 现在总比没有好

for infile in listing:
    try:
        if infile.startswith("ABC"):
            with open(infile,"r") as fo
                for line in fo:
                    if line.startswith("REVIEW"):
                        print infile
    except:
        pass

现在如果发现错误,文件将被关闭,就像with 语句所做的那样。

【讨论】:

    【解决方案2】:

    您的代码正在按照您的要求执行。当你得到一个异常时,它会跳到这个部分:

    except:
        print "error "+str(IOError)
        pass
    

    既然之后就什么都没有了,程序就结束了。

    另外,pass 是多余的。

    【讨论】:

    • @Ankur pass 的意思是“什么都不做”。没有它,您的代码将继续。问题是在你的except 块之后它没有什么可做的。
    【解决方案3】:

    将 try/except 移动到 for 循环中。 喜欢在:

      import os 
        path = 'C:\\'
        listing = os.listdir(path)
        for infile in listing:
            try:    
                if infile.startswith("ABC"):
                    fo = open(infile,"r")
                    for line in fo:
                        if line.startswith("REVIEW"):
                            print infile
                    fo.close()
            except:
                  print "error "+str(IOError)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      相关资源
      最近更新 更多