2013-03-06 46 views
2

这个问题的一般要点:如果甚至有可能发生错误的远程可能性,我是否应该抓住可能的错误?具体来说:防御性编程还是浪费时间?

我有一个应用程序读取和写入程序的以前的历史记录到.txt文件。在初始化时,程序读取历史文件以确定它应该做什么和不应该做什么操作。如果还没有历史文件存在,它会创建一个。像这样:

global trackList 
try: 
    # Open history of downloaded MP3s and transfer it to trackList 
    with open('trackData.txt', 'r') as f: 
     trackrackList = f.readlines() 
except Exception, e: #if file does not exist, create a blank new one 
    with open('trackData.txt', 'w') as f: 
     f.write("") 

然后程序下载基于它们是否是在txt文件的MP3。一旦下载了MP3,它就会将其添加到txt文件中。像这样:

mp3File = requests.get(linkURL) 
with open('trackData.txt', 'a') as f: 
    f.write(linkURL + '\n') 

现在,它几乎是100%%的肯定,txt文件将保留,因为它是在第一个函数创建的时间。我们正在处理在这里下载几个MP3 - 该程序永远不会运行超过几分钟。但是,在下载MP3时,用户可能会删除历史文件或以其他方式损坏文件,在这种情况下程序将因为没有错误处理而崩溃。

如果一个好的程序员将最后一块代码包装在一个try ... except块中,那么它会创建历史文件txt如果文件不存在,或者只是不必要的偏执狂和浪费的空间?这是微不足道的实现,但请记住,我有这样的程序,在那里有几百个机会让用户在一小段时间内删除/破坏以前创建的txt文件。我通常平坦的Python代码会变成嵌套的try ... except雷区。

+3

您只想捕捉*特定的*例外。在这种情况下,catch'OSError',* not *'Exception' .. – 2013-03-06 21:13:16

回答

5

一个更安全的解决方案是打开文件并在下载时保持打开状态。用户将无法删除它。在所有内容下载并记录后,关闭文件。这也会带来更好的性能。

5

为什么在应用程序启动时创建一个空文件?如果该文件在启动时不存在,则不做任何操作 - open('trackData.txt', 'a')仍将创建一个新文件。