Pull to refresh

Comments 15

Что-то у меня после прочтения статьи когнитивный диссонанс возникает (в смысле, не туда вы копаете):
— с одной стороны вы говорите, что в exception-ах Питона сила и могучесть
— с другой стороны — блин, они требуют столько кода/усилий, что приходится писать врапперы, чтобы сделать вид, что эксепшенов какбе нету. А врапперы сами по себе — ад и израИль, для каждой функции их писать.

Я, конечно, никогда не пробовал писать на python или на других похожих скрипт-web-языках, типа php, но может вам non-exceptional языки больше подойдут? Ну там си, все дела — там, говорят, исключений нет, только сигналы.
Наверное, надо подкорректировать вводные абзацы. Я говорю, что если писать try-except, то будет много повторяющегося и плохо читаемого кода, и повторения надо минимизировать, на что и сгодится мощь Питона.
Код на питоне со съеденными отступами — это ад :)
Да, действительно. Я так и не понял, как это делать — редактор то показывает их, то не показывает, и поздно ночью уже хотелось поскорее выложить и пойти спать.
#!/usr/bin/python
import os, shutil, safe
for m in (os.listdir, os.chown, os.chmod, shutil.copy, shutil.move, os.makedirs, os.mkdir):
    m = safe.wrap(m)


Мне кажется или этот код ничего не делает?
Странно, минусов много — комментариев мало…
Этот код оборачивает функции из тупла в safe.wrap.
Да… А результат?
m — локальное имя в цикле. Сам os.listdir не изменится.
Иля я чего-то глобально не понимаю в работе ссылок в питоне?
Да, действительно, тоже локальное имя. Убрал пока что. У вас есть вариант, который бы работал?
Можно сделать модуль, типа safe_os, в нём импортировать, оборачивать, и брать функции для своих модулей уже из него. Интерпретатора под рукой нет, код привести не могу :(
Чтобы работало так, как задумано изначально лучше в любом случае не делать, ИМХО.
Исправьте форматирование кода, пробелы скушались
тег
<pre>
вам поможет
try:
   ...
except:
   ...
плюсанул за старания, но

что это за ужасть?

sys.exc_info()[1].args

вообще-то исключения надо так обрабатывать

>>> def tst():
  try:
    raise IOError('io') if random.randint(0, 1) else OSError('os')
  except (IOError, OSError), e:
    print e.message
  else:
    print 'Unknown exception'

>>> tst()
io
>>> tst()
os


прошу обратить внимание, что тут e это и есть Ваш sys.exc_info()[1].args

И потом, зачем

''.join(f)

когда есть

f.read()


???

Кроме того, мне кажется что проблема немного надумана, а решение чересчур усложнено. Мне кажется разумным принцип «let it crash» хотя он и звучит обычно в контексте Erlang'а. Ну то есть понятно, что пользовательские сообщения об ошибках должны быть user-friendly, но всех эксепшинов все равно не предусмотришь )
За read спасибо. По поводу let it crash — речь не о том, чтобы перехватить всё, а чтобы перехватить типовое, и без копипастов.

И вы, наверное, имеете в виду except (IOError, OSError) as e?
кстати, да, это они в новой версии языка изменили синтаксис исключений немного )
А в 2.5.2, который я использую по-старинке, это вызывает ошибку синтаксиса…
UFO just landed and posted this here
Sign up to leave a comment.

Articles