Здравствуйте, AndrewVK, Вы писали:
AVK>Ответ на исходный вопрос — если в языке есть нормальные исключения, то следует использовать именно их.
В корне неверный ответ. Во-первых, исключения необходимо использовать только в исключительных ситуациях, т.е. в случае ошибки. На то они и исключения, чтобы уведомлять об ошибке. Для уведомления клиента функции о чем-то, что является нормальной ситуацией существует много разных методов. По сути все основные автор вопроса охватил. Функция называется CanSendMessageToUser, т.е. она проверяет возможность доставки сообщения к пользователю. Т.е. для нее как возможность доставки так и его отсутствие являются обычными нормальными ситуациями. Исключение здесь можно кидать только в случае, например, некорректной передачи аргумента User. Во всех остальных случаях получение исключения из данной функции — нонсенс (даже если вообще нет сети или еще невесть что происходит). Самый корректное возвращаемое значение — это bool. Если необходима расшифровка причины проблемы, то необходимо использовать последний способ предложенный автором. С точки зрения дальнейшей поддержки программы и простоты использования это самый корректный путь. А сходства с генерацией исключения тут нет. Когда возникает исключение, то подымается содержимое стека и проводится много еще другой доп. работы. Более того, если клиент этой процедуры не обернет вызов в try/catch то программа может вообще вылететь. А возврат объекта — это обычный возврат объекта.