Форум сайта python.su
igor.kaistПозвольте уточнить, а почему не использовать более изящную и понятную конструкцию?try:
from repr import repr as rp
except:
rp=repr
....
# а дальше такое выражение есть
try:
t=chr(i)
except:
t='\x%02i'%(i)
try:
from repr import repr
except ImportError:
pass
def chr(i):
import __builtin__
try:
return __builtin__.chr(i)
except Exception:
return hex(i)[2:].decode('hex')
Отредактировано (Окт. 21, 2008 12:36:48)
Офлайн
кстати, в догонку к except:
в таком виде, помимо KeyboardInterrupt так же ловится SystemExit, что в общем-то тоже затруднит использование программы :)
(это описано в РЕР-352)
Отредактировано (Окт. 21, 2008 13:13:40)
Офлайн
bwСомнений нет, это действительно исключительная ситуация. Но насчет «ничего не ловлю» — тут я с вами не согласен. Но при пустом except-е ловится BaseException, что не является признаком хорошего тона, и в PEP 352 описываются все последствия столь неосмотрительного применения except без параметров.Это исключительная ситуация, я специально ничего не ловлю. <cut>session.begin()
try:
1/0
except:
session.rollback()
log.err()
else:
session.commit()
session.close()
Отредактировано (Окт. 21, 2008 13:20:58)
Офлайн
clegИллюстрация в догонку:
кстати, в догонку к except:
в таком виде, помимо KeyboardInterrupt так же ловится SystemExit, что в общем-то тоже затруднит использование программы :)
(это описано в РЕР-352)
>>> import sys
>>> import os
>>> try:
... sys.exit()
... except:
... print 'oh shi!'
...
oh shi!
>>> try:
... os._exit()
... except:
... print 'oh shi!'
...
oh shi!
Офлайн
> если все таки написать какую подлянку вы ждете
В дейстивтельности я не жду никаких подлянок, в этом вся суть исключений :-). Это не возврат метода.
> и в PEP 352 описываются все последствия столь неосмотрительного применения except без параметров
К сожалению очень плохой плохой английский не позволяет мне ознакомиться с этим трудом. Машинный перевод дело, в понимании текска, скорее усугобляет, нежели помогает. Вообщем, не уловил я там смысла, почему же так нехорошо использовать “пустой except”.
Что до KeyboardInterrupt и т.п., то мне все равно какое исключение и по какой причине происходит, я должен завершить транзакцию, либо прибить недописанный файл или еще чего сделать. Программа должна нормально выполнить некоторый свой цикл (имеющий начало и обязательный конец) несмотря на придурка жмущего Ctrl+C. Согласен, что стоит несколько раз подумать, прежде чем использовать except без аргументов, да и вообще стоит ли отлавливать исключение.
> так же ловится SystemExit, что в общем-то тоже затруднит использование программы :)
Озвучу, уверен, общую мысль. Затруднит использование программы написанной лишь определенной категорией программистов.
p.s. Ну и еще дополню. Обычно между try и except у меня лежат не 2-3 строчки кода, а несколько сотен или тысяч. Ошибки могут происходить самые разные. Я, впринципе, и не жду каких то конкретных исключений (конкретных типов), а отреагировать нужно на любое.
p.p.s. Врядли я буду вызывать sys.exit() в try..except, хотя кто знает :-). Вообще этим методом не пользовался. В основном на Python я пишу сервисы под управлением Twisted, а обработку исключений выполняю через его механизм Deferred. Слава богу, большую часть времени сервисы работают без человеческого внимания.
..bw
Отредактировано (Окт. 21, 2008 14:00:20)
Офлайн
bw
уже написали не один раз. чтоб не ловить KeyboardInterrupt и SystemExit
потому что прогрмма, не убивающаяся через Ctrl-C и игнорирующая sys.exit() - это плохо
даже если у тебя там будет миллион строк кода (кстати, про то что плохо иметь более 50 строк кода в методе - говорить надо?) то except Exception - у тебя как раз словит абсолюно все, кроме этих двух системных исключений, что и требуется в принципе.
и то что ты не будешь вызывать sys.exit() - это не значит этого не будет делать никто из модулей. и не значит что программе не надо отвечать на системные запросы на завершение корректно.
ЗЫ реагировать одинаково на любое эксепшн в сетевом приложении - верный путь к дырам в безопасности…
Офлайн
Ты не понимаешь о чем я говорю. Вероятно потому что я плохо доношу свою мысль или потому что не хочешь видеть ничего кроме нескольких PEP'ов неизвестных мне людей.
p.s. Я продолжу руководствоваться здравым смыслом, а не документацией и фантазиями их авторов.
..bw
Отредактировано (Окт. 21, 2008 16:12:46)
Офлайн
это ты не понимаешь что мы тут вдвоем пытаемся сказать.
независимо от того что ты пишешь, если ты хочешь быть хорошим программистом (или выглядеть так), то надо все-таки делать то тчо рекомендуют авторы языка. они же это не от вредности рекомендуют. тем более что предложенный тебе правильный вариант будет работать так же как у тебя, но ПРАВИЛЬНЕЕ :)
естественно, ты можешь продолжать писать так как тебе хочется, а не так как надо. я эту тему завел чтобы показывать КАК НЕ НАДО писать на питоне. заметь, не НЕЛЬЗЯ а НЕ НАДО!
в общем, тебе спасибо за пример, надеюсь другие люди все-таки больше доверяют “незнакомым людям” :)
Офлайн
mwizardА можно еще и так:
Единственно возможный выход, который мне видится в таком случае — через ctypes + KillProcess, натравленный на свой PID. Глупо, правда?
os.kill(os.getpid(), 9)
Офлайн
slivlen
о! отлично. теперь тока так и буду делать :) это же красота…
:)
Офлайн