- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
>>> class Foo():
... pass
...
>>> try:
... raise Foo()
... except ExceptionBase as foo:
... print 'foo %s' % foo
... except:
... print 'not an exception'
... else:
... print 'it\'s all good'
...
not an exception
>>>
wvxvw 10.11.2012 01:38 # −2
Yurik 10.11.2012 01:42 # +3
http://ideone.com/txAFim
http://ideone.com/FryFoM
http://ideone.com/vFTVWU
В чем проблема?
Elvenfighter 10.11.2012 02:14 # 0
http://ideone.com/uoFd29
wvxvw 10.11.2012 02:30 # +1
bormand 10.11.2012 07:54 # +3
> нужно только через стек и глубокую интроспекцию вылавливать
Зачем? Есть же sys.exc_info().
http://ideone.com/haVdKw
bormand 10.11.2012 08:01 # +1
Разве что вызвать на нем str() и сохранить в лог...
wvxvw 10.11.2012 11:09 # 0
bormand 10.11.2012 11:14 # +4
Случай, когда нужно ловить объект неизвестно от чего порожденного класса очень подозрителен в плане архитектуры. Что потом можно с ним сделать кроме каста в строку или перевброса? Мы ведь ничего о нем не знаем, и поэтому практически ничего не можем с ним сделать.
P.S. Для тех кому очень-очень нужно есть костыль sys.exc_info.
wvxvw 10.11.2012 11:25 # −1
Еще вариант - демон скрипт, с закрытими дескрипторами инпут/аутпут, в котором важнее, чтобе стерпел, но продолжил работу, чем упал и даже сообщить не смог о том, что лучилось.
Или еще вариант - сервер выполняющий программы написаные другими людьми, которые могут в принципе даже хотеть навредить, или навредить случайно.
Вариантов использования можно придумать.
И естесственно, нужно для логов, кроме str(), есть еще dict() которая может помочь разобраться в том, что это такое.
bormand 10.11.2012 11:41 # +1
> чтобы посигналить что выполнение дошло до какого-то места в коде
> для отладки - очень удобно
А не будет ли проще записать сообщение в лог прямо на месте? Там и информации о проблеме побольше, и работу можно не прерывать.
> сервер выполняющий программы написаные другими людьми
> в котором важнее, чтобе стерпел, но продолжил работу,
Вот поэтому мне и понравилось решение, принятое в третьем питоне. Все исключения порождены от BaseException, ничего другого вбросить нельзя. И написав except BaseException я буду уверен, что поймал все что могло прилететь.
P.S. Сейчас внимательно посмотрел - даже 2.7 не дает кидать все подряд. Только old-style классы и new-style классы порожденные от BaseException.
wvxvw 10.11.2012 11:53 # 0
Нет, не будет. Логи очень быстро переполняются и разбираться когда именно произошла какая запись - совсем не хочется. Или, еще вариант, выполнение кода приводит к бесконечному циклу - совсем не хочется в логе описывать бесконечный цикл.
bormand 10.11.2012 12:02 # 0
P.S. Какие-то притянутые за уши примеры у вас.
wvxvw 10.11.2012 12:10 # 0
В чем смысл записать что-то в лог и тут же завершить программу, если это можно сделать одним действием?
bormand 10.11.2012 12:31 # +2
Действительно. Зачем все эти пробросы исключений, если можно сделать все одним действием. sys.exit("shit happens"). В конце-концов выше вы пишете, что это для отладки, а не для продакшена.
wvxvw 10.11.2012 12:53 # +2
bormand 10.11.2012 13:02 # +1
roman-kashitsyn 10.11.2012 12:02 # 0
На самом деле, <Личные данные удалены> (wvxvw) почти на 10 лет меня старше, но программировать я вроде начал раньше
LispGovno 10.11.2012 12:26 # −1
<Личные_данные_удалены>?
wvxvw 10.11.2012 13:10 # +2
roman-kashitsyn 10.11.2012 11:44 # +2
Всё-таки CL с его "гибкостью" и сигнальным протоколом необратимо травмирует мозг
bormand 10.11.2012 11:51 # +3
1) Первое требование wvxvw - вбросить исключение так, чтобы его не смогли поймать django и прочие.
2) Второе требование wvxvw - иметь такой обработчик, чтобы он ловил все исключения.
Странные, противоречащие друг другу требования...
Если бог сможет создать такой камень, что не сможет его поднять - он не всемогущ. Если бог не сможет создать такой камень, что не сможет его поднять - он не всемогущ. Вывод - бог не всемогущ.
wvxvw 10.11.2012 11:59 # 0
Fai 10.11.2012 12:03 # +1
В реальности ничего сложнее кривой змейки за всю жизнь не написал.
bormand 10.11.2012 12:17 # 0
С джанго не работал, его соглашений насчет исключений не знаю, поэтому ориентировался на ваше же высказывание:
>> где все уже вместо нас поймали
P.S. Способ как поймать все исключения был приведен выше. Давайте переводем тему в конструктивное русло или закроем ее.
wvxvw 10.11.2012 12:57 # 0
Я не говорю, что решения нет вообще. Говнокод заключается в том, что решение плохое, а не в том, что оно отсутствует. Потому что система была построена непродумано. Т.е. человек, который запланировал ловить исключения, и по какой-то причине решил, что бросить Х можно, а ловить его наверное не нужно будет - сделал глупость. Я не знаю... если это не понятно, то мне остается только руками развести.
bormand 10.11.2012 13:16 # 0
Ну вот по той же причине я и писал выше: "Вот поэтому мне и понравилось решение, принятое в третьем питоне. Все исключения порождены от BaseException, ничего другого вбросить нельзя. И написав except BaseException я буду уверен, что поймал все что могло прилететь.". Так что с этим я согласен.
Ну а то что решение для ловли всего подряд корявое - так и ООП в питоне 2.7 корявенькое. С двумя типами классов. Собственно только из-за этих old-style классов обработчик except BaseException и протекает...
Abbath 27.12.2013 02:01 # 0
MAKAKA 03.07.2020 19:06 # 0
3.14159265 03.07.2020 19:11 # 0
guest8 31.01.2019 02:09 # −999
guest8 31.01.2019 02:27 # −999
wvxvw 10.11.2012 11:53 # 0
foo.bar = 42
может не сработать, а программа продолжит выполнятся дальше, и потом foo.bar не понятно чему равен и т.п. Но это с легкостью может произойти где угодно. Я напоролся на такое поведение в SCons, где вроде-бы безобидное except KeyError: поймало ошибку не из того словаря и просто проигнорировало. Потом очень долго искал, куда делась глобальная переменная. То она есть, а то ее нет, но программа притворяется как будто все замечательно.
Steve_Brown 12.11.2012 10:18 # +1
Vindicar 10.11.2012 19:11 # 0
Может, модуль warnings поможет?
gueest8 31.01.2019 04:05 # 0
bormand 10.11.2012 08:24 # +2
У меня для вас плохие новости, в питоне 3 уже нельзя: http://ideone.com/btn9Xn.
TypeError: exceptions must derive from BaseException
TypeError: catching classes that do not inherit from BaseException is not allowed
wvxvw 10.11.2012 11:12 # 0
bormand 10.11.2012 11:16 # 0
wvxvw 10.11.2012 11:32 # +2
Ситуация приведенная выше может случится даже неумышленно, если кто-то создавал ошибку не явно указывая глобальное имя, а опосредовано, через вызов функции, которая должна бы вернуть ошибку, а вернула что-то другое, или через обращение к переменной, в которой по ошибке оказалась не ошибка, а что-то другое. Нормальный, надежный код должен уметь вменяемо отреагировать на такие ситуации.
Vindicar 10.11.2012 18:32 # +2
Кидание черт знает чего вместо исключений - одно из них.
wvxvw 10.11.2012 18:38 # 0
Vindicar 10.11.2012 18:51 # +3
Можно, к примеру, убить вообще стандартный класс Exception, написав
И это отработает. И что теперь, писать обертки и возвращать на место? Или все-таки выкинуть код который работает настолько через задницу, что усилия на его поддержку превысят усилия на его переделку.
wvxvw 10.11.2012 19:02 # 0
Vindicar 10.11.2012 19:04 # 0
Какой именно код чужой?
Тот, который кидает всякую фигню? См. выше.
Тот, который ловит? Тогда вопрос чисто теоретический, потому что кидать невесть что - это плохая идея.
Ни тот ни другой? Тогда вообще не понимаю о чем разговор.
anonimb84a2f6fd141 12.06.2013 18:51 # 0
Потому, что исключения должны наследоваться от Exception. То, что другое выпилили из 3 кагбэ намекает.
Питон, в особенности двойка, позволяет делать много вещей, за которые надо бить по ебалу. В этом его проблема, да.
wvxvw 10.11.2012 02:27 # −1
Остальные примеры - вообще не в кассу.
FAKYOUINTIRNEAT 10.11.2012 01:45 # +2
wvxvw 10.11.2012 02:25 # −2
Fai 10.11.2012 02:31 # −3
roman-kashitsyn 10.11.2012 09:07 # +1
bormand 10.11.2012 09:16 # +1
eth0 10.11.2012 11:29 # +4
Fai 10.11.2012 13:09 # +1
scriptin 10.11.2012 21:09 # −3
inkanus-gray 10.11.2012 22:14 # −2
LispGovno 10.11.2012 22:43 # −1
inkanus-gray 10.11.2012 23:14 # 0
Lure Of Chaos 11.11.2012 01:06 # +1
guest8 31.01.2019 02:10 # −999
guest8 03.07.2020 20:52 # −999
guest8 06.11.2018 00:32 # −999
guest8 06.11.2018 00:31 # −999
nemyx 03.07.2020 19:01 # 0
gueest8 31.01.2019 02:00 # 0
JIyHHblu_nemyx 31.01.2019 02:07 # 0
guest 10.11.2012 07:38 # −3
guest 23.11.2012 20:21 # +1
virusinho 05.07.2020 17:49 # 0