Форум сайта python.su
Следующий код работает так: если файл config.dbfile() существует, то либо скрипт говорит, что прекращается, либо, если задан параметр -f, скрипт стирает файл и создаёт по-новой.
Хочу написать корректно, с обработкой исключений, например, если нет прав стереть файл или создать, об этом нужно сообщить и выйти без ужасных системных сообщений.
1) Правильно ли написана конструкция?
#!/usr/bin/python
# -*- coding: utf-8 -*-
import config, os, sys
if os.path.isfile(config.dbfile()):
print 'Database file "{0}" already exists in current folder'.format(config.filename)
if '-f' not in sys.argv:
print 'Can`t install.'
quit()
else:
print '-f (force) parameter set, deleting the file.'
try: # -- так?
os.remove(config.dbfile())
except:
'Can`t delete existing file. Installation cancelled.'
import db
db.conn.execute('CREATE TABLE operation (a INTEGER)')
db.conn.commit()
$ sudo gedit x.sqlite
$ ./install.py
Офлайн
eki-attarНе надо перехватывать все исключения
1) Правильно ли написана конструкция?
eki-attarПотому что для удаления файла нужны права записи на каталог где он находиться, а вовсе не на файл.
2) Почему если файл создан под рутом, он всё равно стирается? Cам скрипт я под ним не запускаю.
Офлайн
PooHСпасибо!
Потому что для удаления файла нужны права записи на каталог где он находиться, а вовсе не на файл.
PooHПочему? Скрипт-то надо хотя бы прекратить, если нельзя работать с файлом. Вот вывод если перехватывать исключение:
Не надо перехватывать все исключения
$ ./install.py -f
Database file "x.sqlite" already exists in current folder
-f (force) parameter set, deleting the file.
$ ./install.py -f
Database file "x.sqlite" already exists in current folder
-f (force) parameter set, deleting the file.
Traceback (most recent call last):
File "./install.py", line 17, in <module>
import db
File "************/db.py", line 3, in <module>
conn = sqlite3.connect(config.dbfile())
sqlite3.OperationalError: unable to open database file
try:
os.remove(config.dbfile())
except:
print 'Can`t delete existing file. Installation cancelled.'
quit()
Офлайн
PooH имел ввиду, что надо перехватывать только нужное тебе исключение. Его имя можно наблюдать в сообщении об ошибке, когда внутри блока try происходит ошибка, например, если видишь:
OSError: No such file or directory: ‘file’
то имя исключения OSError, это как раз твой случай
try:
os.remove(config.dbfile())
except(OSError):
print 'Can`t delete existing file. Installation cancelled.'
quit()
Отредактировано (Авг. 23, 2009 00:26:40)
Офлайн
Понятно, спасибо!
Офлайн