Для протагонистов исключений они обычно вытекают из транзакционного программирования и строгих гарантий безопасности исключений или слепых инструкций. В любой приличной сложности, т.е. асинхронный рабочий процесс, ввод-вывод и особенно сетевой код - они просто неуместны. Причина, по которой вы видите документацию в стиле Google по этому вопросу в C ++, а также весь хороший асинхронный код, «не соблюдающий его» (подумайте также о ваших любимых управляемых пулах).
Это еще не все, и хотя это может показаться упрощением, на самом деле все просто. Для одного вы получите множество исключений в том, что не было предназначено для интенсивного использования исключений ... в любом случае, я отвлекся, прочитав об этом от ведущих мировых дизайнеров библиотек, обычное место - повышение (просто не путайте это с другим лагерем в Boost, который любит исключения, потому что им пришлось писать музыкальные программы: -).
В вашем случае, и это не опыт Фаулера, эффективная идиома «пустой объект» возможна только в C ++ благодаря доступному механизму приведения (возможно, но не всегда с помощью доминирования ) .. С другой стороны, в вашем нулевом типе вы можете генерировать исключения и делать все, что захотите, при этом сохраняя чистый сайт вызовов и структуру кода.
В C # ваш выбор может быть одним экземпляром типа, который является хорошим или неправильным; как таковой он способен бросать приемы или просто работать как есть. Так что это может или не может нарушать другие контракты (в зависимости от качества кода, который вы считаете нужным, зависит от вас, что вы считаете лучше).
В конце концов, он очищает сайты вызовов, но не забывайте, что вы столкнетесь со столкновением со многими библиотеками (и особенно с возвратами из контейнеров / словарей, на ум приходят конечные итераторы и любой другой «интерфейсный» код для внешний мир). Плюс проверки нулевого значения как значения являются чрезвычайно оптимизированными частями машинного кода, о которых следует помнить, но я согласен, что любое использование диких указателей в любое время без понимания константности, ссылок и многого другого приведет к различного рода изменчивости, псевдонимам и проблемам перфорирования. .
Чтобы добавить, серебряной пули не существует, и сбой по нулевой ссылке или использование нулевой ссылки в управляемом пространстве, или выброс и исключение обработки исключения - идентичная проблема, несмотря на то, что мир управляемых и исключений попытается продать вас. Любая приличная среда предлагает защиту от них (черт возьми, вы можете установить любой фильтр на любую ОС, какую хотите, что еще, по вашему мнению, делают виртуальные машины), и существует так много других векторов атак, что этот был разбит на куски. Еще раз введите подтверждение x86 от Google, их собственный способ сделать намного быстрее и лучше «IL», «динамический» дружественный код и т. Д.
Придерживайтесь своего инстинкта, взвесьте все за и против и локализуйте эффекты ... в будущем ваш компилятор в любом случае оптимизирует все эти проверки и будет гораздо эффективнее, чем любой человеческий метод во время выполнения или во время компиляции (но не как легко для межмодульного взаимодействия).