2013-03-06 3 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("") 

Программа затем переходит к загрузке файлов MP3 в зависимости от того или не были они в файле txt. После того, как он загрузил MP3, он добавляет его в файл txt. Как так:

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

Теперь, почти 100% процентов уверен, что файл txt останется с момента его создания в первой функции. Мы имеем дело с загрузкой нескольких MP3 здесь - программа не будет работать более нескольких минут. Тем не менее, существует удаленная возможность того, что файл истории txt будет удален пользователем или иным образом поврежден во время загрузки MP3, и в этом случае программа выйдет из строя, потому что обработка ошибок отсутствует.

Может ли хороший программист обернуть этот последний блок кода в блоке try ... except, который создает файл истории txt, если он не существует, или это просто лишняя паранойя и потраченное впустую пространство? Это тривиально реализовать, но имейте в виду, что у меня есть такие программы, где есть буквально сотни возможностей для пользователей удалять/повреждать ранее созданный файл txt в крошечном окне времени. Мой обычный плоский код Python превратился бы в вложенное минное поле try ... except.

+3

Вы хотите поймать * особые * исключения только. В этом случае catch 'OSError', * not *' Exception' .. –

ответ

5

Более безопасным решением было бы открыть файл и оставить его открытым, пока вы все еще загружаете. Пользователь не сможет удалить его. После того, как все будет загружено и зарегистрировано, закройте файл. Это также приведет к повышению производительности.

5

Почему вы создаете пустой файл при запуске приложения? Просто ничего не делайте, если файл отсутствует при запуске - open('trackData.txt', 'a') все равно создаст новый файл.

Смежные вопросы