В некоторых новых языках программирования (Go, Swift) уходят от механизма исключений и подавляющее число ошибок обрабатывается через явный возврат ошибки из вызываемой функции. В качестве аргумента часто показывают пальцем на язык С++. Наличие там исключений заставляет писать весь код так, как будто из любого вызова функции может вылететь исключение и размотать стек.
На мой взгляд это проблема исключительно С++, а точнее его двух особенностей — отсутствие GC и запрет исключений в деструкторах.
Собственно все проблемы с исключениями решаются тремя простыми методиками:
1. Наличие GC позволяет не беспокоиться об утёкшей памяти из-за исключения.
2. Другие ресурсы практически всегда закрываются там же, где открываются, поэтому defer/finally-подобные конструкции позволяют очень легко устранить утечки этих ресурсов.
3. Исключение должно бросаться откуда угодно и программа должна себя вести корректно при этом (это я про исключения в десктрукторе/finally-блоке и тд).
Какие есть серьёзные аргументы против исключений и за (извиняюсь за каламбур) возврат к кодам возврата? Ведь это же ужасный код, когда после вызова каждой функции мы тут же проверяем err и если он не null, просто передаём его наверх. Это то, от чего избавляют исключения.
Я перечитал много разных статей, но нигде не видел чётких аргументов в пользу отказа от исключений. Go вообще забавный язык, panic()/recover() это исключений как они есть, один в один. Любой код с исключениями тривиальными заменами преобразовывается в код с panic()/recover(). Но при этом они утверждают, что от исключений они избавились.