Лучше бросить и поймать ex-info. В текущем слое возникла ситуация, которую тут обработать нельзя. Бросаем исключение в надежде, что его обработают. Обрабатывать свои исключения в других слоях - ок. Возвращать коды - привет C и, простите, golang. Там это уместно, а в jvm/js есть исключения.