Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 22, 2009 12:40:19

eki-attar
От:
Зарегистрирован: 2009-06-29
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно сделать try-except?

Следующий код работает так: если файл 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



Офлайн

#2 Авг. 22, 2009 12:55:01

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Как правильно сделать try-except?

eki-attar
1) Правильно ли написана конструкция?
Не надо перехватывать все исключения
eki-attar
2) Почему если файл создан под рутом, он всё равно стирается? Cам скрипт я под ним не запускаю.
Потому что для удаления файла нужны права записи на каталог где он находиться, а вовсе не на файл.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Авг. 22, 2009 13:04:34

eki-attar
От:
Зарегистрирован: 2009-06-29
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно сделать try-except?

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()



Офлайн

#4 Авг. 23, 2009 00:17:17

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно сделать try-except?

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)

Офлайн

#5 Авг. 24, 2009 00:12:43

eki-attar
От:
Зарегистрирован: 2009-06-29
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно сделать try-except?

Понятно, спасибо!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version