Y> Ожидаемая/неожидаемая — это не всегда бинарное состояние. Что если ожидаемая, но очень редкая?
Как я понимаю, это зависит от способа, которым ты собираешься реагировать на ошибку. Если сразу после возврата из функции — тогда код возврата, если в неопределенном месте сделать откат — тогда исключение. При этом есть переходная "серая" зона, когда для одного и того же метода возможна в одном проекте обработка кода ошибки, а в другом можно спокойно грохнуть приложение. Для каких-то методов должны быть предусмотрены оба варианта (с кодом ошибки и исключением).