Почему в языке 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
.
Это пример того, как в разных языках принято делать по разным причинам.
Спасибо, полезная заметка
Спасибо, а можно еще добавить дату и время размещения поста тут?
Добавили в списке
благодарствую!
Или войти через: