- 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
>>>
http://ideone.com/txAFim
http://ideone.com/FryFoM
http://ideone.com/vFTVWU
В чем проблема?
http://ideone.com/uoFd29
> нужно только через стек и глубокую интроспекцию вылавливать
Зачем? Есть же sys.exc_info().
http://ideone.com/haVdKw
Разве что вызвать на нем str() и сохранить в лог...
Случай, когда нужно ловить объект неизвестно от чего порожденного класса очень подозрителен в плане архитектуры. Что потом можно с ним сделать кроме каста в строку или перевброса? Мы ведь ничего о нем не знаем, и поэтому практически ничего не можем с ним сделать.
P.S. Для тех кому очень-очень нужно есть костыль sys.exc_info.
Еще вариант - демон скрипт, с закрытими дескрипторами инпут/аутпут, в котором важнее, чтобе стерпел, но продолжил работу, чем упал и даже сообщить не смог о том, что лучилось.
Или еще вариант - сервер выполняющий программы написаные другими людьми, которые могут в принципе даже хотеть навредить, или навредить случайно.
Вариантов использования можно придумать.
И естесственно, нужно для логов, кроме str(), есть еще dict() которая может помочь разобраться в том, что это такое.
> чтобы посигналить что выполнение дошло до какого-то места в коде
> для отладки - очень удобно
А не будет ли проще записать сообщение в лог прямо на месте? Там и информации о проблеме побольше, и работу можно не прерывать.
> сервер выполняющий программы написаные другими людьми
> в котором важнее, чтобе стерпел, но продолжил работу,
Вот поэтому мне и понравилось решение, принятое в третьем питоне. Все исключения порождены от BaseException, ничего другого вбросить нельзя. И написав except BaseException я буду уверен, что поймал все что могло прилететь.
P.S. Сейчас внимательно посмотрел - даже 2.7 не дает кидать все подряд. Только old-style классы и new-style классы порожденные от BaseException.
Нет, не будет. Логи очень быстро переполняются и разбираться когда именно произошла какая запись - совсем не хочется. Или, еще вариант, выполнение кода приводит к бесконечному циклу - совсем не хочется в логе описывать бесконечный цикл.
P.S. Какие-то притянутые за уши примеры у вас.
В чем смысл записать что-то в лог и тут же завершить программу, если это можно сделать одним действием?
Действительно. Зачем все эти пробросы исключений, если можно сделать все одним действием. sys.exit("shit happens"). В конце-концов выше вы пишете, что это для отладки, а не для продакшена.
На самом деле, <Личные данные удалены> (wvxvw) почти на 10 лет меня старше, но программировать я вроде начал раньше
<Личные_данные_удалены>?
Всё-таки CL с его "гибкостью" и сигнальным протоколом необратимо травмирует мозг
1) Первое требование wvxvw - вбросить исключение так, чтобы его не смогли поймать django и прочие.
2) Второе требование wvxvw - иметь такой обработчик, чтобы он ловил все исключения.
Странные, противоречащие друг другу требования...
Если бог сможет создать такой камень, что не сможет его поднять - он не всемогущ. Если бог не сможет создать такой камень, что не сможет его поднять - он не всемогущ. Вывод - бог не всемогущ.
В реальности ничего сложнее кривой змейки за всю жизнь не написал.
С джанго не работал, его соглашений насчет исключений не знаю, поэтому ориентировался на ваше же высказывание:
>> где все уже вместо нас поймали
P.S. Способ как поймать все исключения был приведен выше. Давайте переводем тему в конструктивное русло или закроем ее.
Я не говорю, что решения нет вообще. Говнокод заключается в том, что решение плохое, а не в том, что оно отсутствует. Потому что система была построена непродумано. Т.е. человек, который запланировал ловить исключения, и по какой-то причине решил, что бросить Х можно, а ловить его наверное не нужно будет - сделал глупость. Я не знаю... если это не понятно, то мне остается только руками развести.
Ну вот по той же причине я и писал выше: "Вот поэтому мне и понравилось решение, принятое в третьем питоне. Все исключения порождены от BaseException, ничего другого вбросить нельзя. И написав except BaseException я буду уверен, что поймал все что могло прилететь.". Так что с этим я согласен.
Ну а то что решение для ловли всего подряд корявое - так и ООП в питоне 2.7 корявенькое. С двумя типами классов. Собственно только из-за этих old-style классов обработчик except BaseException и протекает...
foo.bar = 42
может не сработать, а программа продолжит выполнятся дальше, и потом foo.bar не понятно чему равен и т.п. Но это с легкостью может произойти где угодно. Я напоролся на такое поведение в SCons, где вроде-бы безобидное except KeyError: поймало ошибку не из того словаря и просто проигнорировало. Потом очень долго искал, куда делась глобальная переменная. То она есть, а то ее нет, но программа притворяется как будто все замечательно.
Может, модуль warnings поможет?
У меня для вас плохие новости, в питоне 3 уже нельзя: http://ideone.com/btn9Xn.
TypeError: exceptions must derive from BaseException
TypeError: catching classes that do not inherit from BaseException is not allowed
Ситуация приведенная выше может случится даже неумышленно, если кто-то создавал ошибку не явно указывая глобальное имя, а опосредовано, через вызов функции, которая должна бы вернуть ошибку, а вернула что-то другое, или через обращение к переменной, в которой по ошибке оказалась не ошибка, а что-то другое. Нормальный, надежный код должен уметь вменяемо отреагировать на такие ситуации.
Кидание черт знает чего вместо исключений - одно из них.
Можно, к примеру, убить вообще стандартный класс Exception, написав
И это отработает. И что теперь, писать обертки и возвращать на место? Или все-таки выкинуть код который работает настолько через задницу, что усилия на его поддержку превысят усилия на его переделку.
Какой именно код чужой?
Тот, который кидает всякую фигню? См. выше.
Тот, который ловит? Тогда вопрос чисто теоретический, потому что кидать невесть что - это плохая идея.
Ни тот ни другой? Тогда вообще не понимаю о чем разговор.
Потому, что исключения должны наследоваться от Exception. То, что другое выпилили из 3 кагбэ намекает.
Питон, в особенности двойка, позволяет делать много вещей, за которые надо бить по ебалу. В этом его проблема, да.
Остальные примеры - вообще не в кассу.