Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 26, 2015 08:30:33

koluna
Зарегистрирован: 2014-07-08
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Возвращение и обработка ошибок (return vs. raise)

Всем привет!

Объясните, пожалуйста, поподробнее, в каких случаях хорошим стилем является генерация исключения при ошибке, а в каких возвращение кода ошибки с помощью return.
Сейчас пользуюсь и тем и другим, но какой-то четко сформированной методики нет и периодически меня это мучает…

Офлайн

#2 Фев. 26, 2015 10:41:57

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Возвращение и обработка ошибок (return vs. raise)

Если посмотреть на исходники всяких проектов, то там повсеместно используется исключения, как стандартные, так и самописанные для персональных случаев. И это более практикуемый подход, даже более питонячий.
Код ошибки возвращается при аварийном завершении работы программы - это UNIX way.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Фев. 26, 2015 11:01:33

koluna
Зарегистрирован: 2014-07-08
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Возвращение и обработка ошибок (return vs. raise)

JOHN_16
Если посмотреть на исходники всяких проектов, то там повсеместно используется исключения, как стандартные, так и самописанные для персональных случаев. И это более практикуемый подход, даже более питонячий.

Я тоже перехватываю стандартные и свои пишу.
Но окончательно со стилем пока не определился.

Интересно, есть какие-нибудь общие рекомендации по стилю генерации и обработки исключений в Питоне?
Допустим, имеем несколько вложенных вызовов функций, функция каждого уровня может генерировать свои исключения.

JOHN_16
Код ошибки возвращается при аварийном завершении работы программы - это UNIX way.

Так, это Вы про Питон или вообще?
Интересно, на каком уровне вложенности вызовов функций оптимальным будет завершить программу с возвращением кода ошибки sys.exit()?

А функции тогда просто возвращают результат своей работы (если есть, что возвращать)?

Офлайн

#4 Фев. 26, 2015 14:25:28

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Возвращение и обработка ошибок (return vs. raise)

не вижу сути проблемы
если есть ошибка, если нужно перехвати, если нужно рейзни свою

Офлайн

#5 Фев. 27, 2015 07:35:53

koluna
Зарегистрирован: 2014-07-08
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Возвращение и обработка ошибок (return vs. raise)

sander
не вижу сути проблемыесли есть ошибка, если нужно перехвати, если нужно рейзни свою

Скажем так, я привык к Си, там несколько иной подход.
А тут появилась альтернатива… и надо выбрать: что, когда и как использовать
Пока применяю смешанный подход, иногда ошибки из функций возвращаются с помощью return, иногда с помощью raise. Но return, судя по всему, для этого использовать не особо питонически…

Офлайн

#6 Фев. 27, 2015 08:49:07

Tiendil
Зарегистрирован: 2014-09-23
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Возвращение и обработка ошибок (return vs. raise)

Ошибку следует возвращать явно, когда вызывающий код точно знает что с ней делать (имеет всю необходимую информацию, чтобы это определить).

Исключение кидается, когда вызывающий код может не знать что с этой ошибкой делать (не имеет информации для принятия решения). В этом случае кинуть исключение проще, чем делать проброс ошибки через 100500 функций.



разработчик MMOZPG «Сказка» — http://the-tale.org

Офлайн

#7 Фев. 27, 2015 09:12:44

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Возвращение и обработка ошибок (return vs. raise)

Tiendil
как раз таки наоборот. Описывается собственный класс ошибки, в любом месте генерируется исключение на основе этого класса. Далее если блок try принимающий либо знает что с ним делать либо отправляет дальше. Случай если не знает что делать вообще больше похож на ситуацию когда код аварийно завершает свое выполнение. Т.е. выглядит это условно так:

try:
    # код здесь
except My_little_warning:
    # на случай ожидаемой ошибки можно предпринять небольшие действия,
    # не отражающиеся на работе кода в целом. Или попробовать другие 
    # аргументы для кода выполняющего ся в цикле и перебирающие варианты
    #  в поисках рабочего и т.д. и .т.п
except My_exception:
    # произошла ошибка, пишем в лог, отменяем транзакцию и тп
except Exception:
    # тот самый случай кода мы не знаем что за ошибка, но не надо 
    # аварийно завершать код
except BaseException:
    # видел вот такой вот прием - т.к. этот класс находится выше всех 
    # остальных в иерархии, то его явная генерация как раз на случай
    #  "запланированного аварийного завершения"



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version