Почему в языке Go авторы не добавили выбрасывание исключений, как сделано в Java и PHP?
PHP на каждый запрос запускает скрипт в отдельном процессе. Пришло сто юзеров – запустилось сто скриптов.
В случае любой ошибки там удобно из глубины просто бросить исключение и сверху поймать, показав 500 Server Error. Даже можно не ловить, ведь php-fpm сам вернёт 500, если скрипт умер.
В итоге если у двух юзеров из ста вылетел непойманный эксепшен подключения к БД, убив процесс, то остальные 98 юзеров это не заметят.
А в Go вместо одноразовых индивидуальных процессов запускается один общий, принимающий запросы от всех юзеров в цикле. И этот процесс внутри может порождать дочерние рутины. И в итоге любой непойманный RuntimeException может мгновенно убить весь этот главный процесс-сервер с кучей рутин, обслуживающих тысячи клиентов.
Поэтому в асинхронных системах кидаться исключениями весьма рискованно. И там как раз отказываются от исключений в пользу возврата ошибок.
Почему не сделали как в PHP или Java, где спокойно используют исключения.
В каждом языке есть специфические нюансы и договорённости.
Например, насчёт возврата null есть разница в типизации между PHP и Java, которая влияет на использование исключений.
В PHP есть возможность через nullable-тип вроде ?User явно указать, что метод вернёт объект юзера или null. Поэтому можно спокойно возвращать null, и статические анализаторы и IDE подскажут, если мы после вызова забудем проверить результат на if (x === null). Проблем нет.
А в Java, наоборот, такого нет. Там если указан тип User туда можно всё равно вернуть или присвоить null. И анализатор и компилятор это проследить не может. В итоге если из метода с типом User вернуть null, то код выше свалится по NullPointerException.
Поэтому в Java есть общепринятая договорённость никогда не возвращать null. Вместо этого принято кидать исключения, возвращать объект Null Object или оборачивать результат или null в объект Optional.
В итоге есть Go вообще без исключений, есть Java с исключениями или NullObject без использования null и есть PHP с исключениями и спокойным использованием null.
Это пример того, как в разных языках принято делать по разным причинам.
Спасибо, полезная заметка
Спасибо, а можно еще добавить дату и время размещения поста тут?
Добавили в списке
благодарствую!
Или войти через: