Альтернатива исключениям для методов, которые возвращают объекты - PullRequest
3 голосов
/ 28 января 2012

У меня есть класс, который может выполнять множество типов преобразований для данного объекта.

Все данные предоставляются пользователями (через созданные вручную командные файлы), но по большей части невозможно определить, действительны ли файловые команды, до тех пор, пока мы не начнем их преобразовывать (если мы сначала проверим все, мы окажемся в итоге выполняет ту же работу, что и сами преобразования)

Эти методы преобразования вызываются для объекта, и он возвращает вновь преобразованный объект, однако, если возникает проблема, мы выкидываем исключение, поскольку возвращение объекта (даже пустого объекта) может быть перепутано с успехом, тогда как исключение отправляет сигнал сброса. возникла проблема, и объект не может быть возвращен. Это также означает, что нам не нужно вызывать функцию типа «получить последнюю ошибку», чтобы выяснить, что именно пошло не так (код ошибки, сообщение, утверждение и т. Д.)

Однако, прочитав многочисленные ответы на SO, кажется, что это неверно, поскольку неправильный ввод данных пользователем не является исключительным обстоятельством, и из-за сложности этой вещи пользователь нередко представляет неверные командные файлы.

Производительность здесь не является проблемой, потому что, если мы увидим ошибку, мы должны остановиться и вернуться к пользователю.

Если я использую коды возврата, мне нужно будет взять выходной объект в качестве параметра, а затем проверить коды возврата, которые мне понадобятся, если они будут долго вложенными в блоки (т. Е. Способ проверки HRESULT из COM)

Как бы я избегал исключений в этом случае, сохраняя при этом код достаточно аккуратным?

Ответы [ 2 ]

3 голосов
/ 28 января 2012

Дизайн вашей проблемы действительно подходит для исключений. Тот факт, что выполнение программы будет остановлено или будет недействительным, когда пользователь предоставит неверный входной файл, является признаком «исключительных обстоятельств». Конечно, многие запуски программы приведут к тому, что будет сгенерировано (и перехвачено) исключение, но это происходит за одно выполнение программы.

То, что вы читаете об исключениях, является медленным при использовании для любых других обстоятельств, допустимо только в том случае, если программа может восстановиться, и должно часто восстанавливаться (например, компилятор, который не может найти заголовок в каталоге поиска и имеет чтобы посмотреть следующий каталог в списке поисковых каталогов, что действительно часто происходит).

Используйте исключения. Если вы сомневаетесь, измерьте, если это убивает производительность. Более чистый код >> следуя тому, что люди говорят на SO. Но опять же, это было бы причиной игнорировать то, что я только что сказал.

1 голос
/ 28 января 2012

Ну, я бы не стал (избегать исключений).Если вам действительно нужен механизм «сообщения об ошибках» (и он вам нужен), кроме возвращаемых значений и исключений, есть немного.Я думаю, что весь спор о том, что является достаточно исключительным (и поэтому заслуживает исключений), а что нет, не так важен, чтобы удержать вас от решения вашей проблемы.Особенно, если производительность не проблема.Но если вы ДЕЙСТВИТЕЛЬНО хотите избежать исключений, вы можете использовать какие-то глобальные очереди, чтобы поставить в очередь информацию об ошибках.Но это ужасно, если вы спросите меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...