Найти - Пользователи
Полная версия: Как правильно сделать try-except?
Начало » Python для новичков » Как правильно сделать try-except?
1
eki-attar
Следующий код работает так: если файл 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()
2) Почему если файл создан под рутом, он всё равно стирается? Cам скрипт я под ним не запускаю.
$ sudo gedit x.sqlite
$ ./install.py
PooH
eki-attar
1) Правильно ли написана конструкция?
Не надо перехватывать все исключения
eki-attar
2) Почему если файл создан под рутом, он всё равно стирается? Cам скрипт я под ним не запускаю.
Потому что для удаления файла нужны права записи на каталог где он находиться, а вовсе не на файл.
eki-attar
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()
pasaranax
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()
Иначе, ты можешь заглушить какую-нибудь другую ошибку, и долго потом ее искать :)
eki-attar
Понятно, спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB