Обработка ошибок
Apr. 21st, 2020 07:35 pmЕсть условно три стиля обработки ошибок.
1. C-style, он же код возврата. Возвращаем недопустимое значение (обычно 0 или -1 или NULL), если операция провалилась. Недостаток - осмысленное описание ошибки не передать. Достоинства: дешево и быстро.
2. Python-style, он же "кидаться исключениями". Возвращается только успех, при ошибке кидается исключение. Недостатки: исключения дороже, нетривиальнее, очень странно ловятся во всяких корутинах, сложно вернуть одновременно нормальный ответ. Достоинства: просто пишется.
3. Go-style, или "да здравствует тупл". Возвращается всегда пара (ответ, ошибка). Если ошибка NULL, то случился успех. Недостатки: более медленный возврат в неприспособленных к этому языках (сиречь не Go), необходимость постоянно работать с туплом/парой в возврате (это некрасиво). Достоинства: детерминированное исполнение без разлета исключений при сохранении развесистой ошибки.
Я это к чему: пилю я тут на aiohttp+asyncio питоновскую приложеньку с корутинами. И вот уперся в дилемму: ловить-пробрасывать исключения в корутинах задача не самая приятная, да и глючить, говорят, может.
Насколько имеет смысл в Питоне эмулировать Го-стайл возврат и вместо кидания своего исключения или при поимке чужого аккуратно возвращать пару результат-ошибка?
1. C-style, он же код возврата. Возвращаем недопустимое значение (обычно 0 или -1 или NULL), если операция провалилась. Недостаток - осмысленное описание ошибки не передать. Достоинства: дешево и быстро.
2. Python-style, он же "кидаться исключениями". Возвращается только успех, при ошибке кидается исключение. Недостатки: исключения дороже, нетривиальнее, очень странно ловятся во всяких корутинах, сложно вернуть одновременно нормальный ответ. Достоинства: просто пишется.
3. Go-style, или "да здравствует тупл". Возвращается всегда пара (ответ, ошибка). Если ошибка NULL, то случился успех. Недостатки: более медленный возврат в неприспособленных к этому языках (сиречь не Go), необходимость постоянно работать с туплом/парой в возврате (это некрасиво). Достоинства: детерминированное исполнение без разлета исключений при сохранении развесистой ошибки.
Я это к чему: пилю я тут на aiohttp+asyncio питоновскую приложеньку с корутинами. И вот уперся в дилемму: ловить-пробрасывать исключения в корутинах задача не самая приятная, да и глючить, говорят, может.
Насколько имеет смысл в Питоне эмулировать Го-стайл возврат и вместо кидания своего исключения или при поимке чужого аккуратно возвращать пару результат-ошибка?
(no subject)
Date: 2020-04-21 05:32 pm (UTC)(no subject)
Date: 2020-04-21 05:44 pm (UTC)Но тут какое дело, народ хочет инфы об ошибках в базе (отдельную таблицу выпросил) и не хочет идти в syslog. И вот тут начинаешь думать, то ли протаскивать коннект до базы туда, где он нафиг не нужен, то ли тащить подробную инфу об ошибке наверх по стеку - а второй вариант работает только в Го-стайл-возврате.