Обработка ошибок. Исключения vs Монады
Чуваки из интернета говорят, что исключения - зло, а монады - лучше и вообще будущее. Я потратил 5 часов на то, чтобы разобраться в теме того, как можно обрабатывать ошибки, и в чем разница
Исключения
Что-то ломается, у тебя вылезает ошибка, программа останавливается. При этом, указывается traceback ошибки
Монады
Все значения, которые функции возвращают, у нас оборачиваются в прослойку, она может быть Ok или Wrong (для примера. Ok - ошибки нет. Wrong - ошибка есть. мы сами з коде пишем, какие значения к каким категориям относятся)
И мы вручную проверяем, вернула ли програма Ok или Wrong. Если Ok - продолжаем программа, если Wrong - выводим ограниченную информацию об ошибке и стопаем программу
Я скажу две вещи:
Первая -
НЕТ НИКАКОЙ РАЗНИЦЫ. В ОБОИХ СЛУЧАЯХ ТЫ ПРОСТО ПРОПИСЫВАЕШЬ ИНФОРМАЦИЮ ОБ ОШИБКЕ И СТОПАЕШЬ ПРОГРАММУ (в большинстве случаев)
Вторая -
то, как реализованы монады в Go - это уродство. в Go тебе надо при каждом вызове функции писать
result, err := func()
if err != nil {...}
то есть при каждом вызове функции тебе надо говорить, че делать, если функция вернула ошибку (в большинстве случаев выбрасывать panic). это ничуть не лучше try... except, это не элегантно. в Rust чуть получше сделали с паттерн-матчингом результатов функции
Короче, тема непрактичная и оверхайп. Опять программисты по хуйне в интернете сруться
Но это я знаю точно:
- если ты обрабатываешь ошибки так, то тебя надо уволить:
try:
...
except:
pass
- если ты возвращаешь None в случае неуспеха программы, и не райзишь эксепшн, то так тоже делать нежелательно
Ссылка на оригинальный пост: https://t.me/sh1nke9/354