Какова лучшая реализация механизма исключения? - PullRequest
2 голосов
/ 15 сентября 2008

Большинство языков программ имеют некоторую обработку исключений; в некоторых языках есть коды возврата, в других - «пробуй / лови» или «спасай / повторяй» и т. д., каждый из которых имеет свои особенности в удобочитаемости, надежности и практической эффективности при разработке больших групп. Какой из них лучший и почему?

Ответы [ 5 ]

2 голосов
/ 15 сентября 2008

Я бы сказал, что это зависит от характера вашей проблемы. Различные проблемные области могут требовать почти произвольных сообщений об ошибках, в то время как другие тривиальные задачи могут просто возвращать NULL или -1 в случае ошибки.

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

Представьте, что у вас есть API, где вы запрашиваете индексный ключ для некоторой карты, сохраняете его в списке и затем продолжаете работать. Затем API в более поздний момент отправляет обратный вызов, и этот метод может затем пройти таблицу, используя ключ, который может быть -1 в этом примере (код ошибки). BOOM, приложение аварийно завершает работу, когда вы индексируете значение -1 в некотором массиве, и такие проблемы могут быть очень трудными. Это все еще тривиальный пример, но он иллюстрирует проблему с кодами ошибок.

С другой стороны, коды ошибок быстрее, чем выдача исключений, и вы можете использовать их для часто используемых вызовов методов - если уместно возвращать такой код ошибки. Я бы сказал, что попытка инкапсулировать эти типы кодов ошибок в частную сборку была бы вполне приемлемой, поскольку вы не предоставляете эти коды ошибок клиенту API. Всегда не забывайте строго документировать эти методы, так как такие типы ядерных приложений могут храниться в приложении в течение длительного времени, так как они были запущены до его запуска.

Лично я предпочитаю сочетание их обоих в некоторой степени. Я использую исключения только для этого - исключения - когда программа переходит в состояние, которое не ожидалось и должно сообщить, что что-то вышло из-под плана. Я не занимаюсь написанием блоков try / catch по всему коду, но все зависит от личных предпочтений.

1 голос
/ 15 сентября 2008

Лучше всего для чего? Языковой дизайн всегда о компромиссах. Преимущество кодов возврата заключается в том, что они не требуют поддержки во время выполнения, кроме обычных вызовов функций; недостатки: 1) вы всегда должны проверять их 2) тип возвращаемого значения должен иметь значение ошибки, которое не является допустимым результатом вызова функции.

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

Различия между семантикой обработки исключений в разных языках (и в системе условий Lisp, в эжекторах E и т. Д.) В основном проявляются в том, как обрабатывается разматывание стека, когда выполнение программы должно продолжаться.

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

0 голосов
/ 15 сентября 2008

Необычный взгляд на обработку исключений см. В Haskell Control.Exception monad

0 голосов
/ 15 сентября 2008

Я должен был бы пойти с концепцией try / catch. Я чувствую, что с точки зрения читабельности это обеспечивает больше всего для сопровождающего кода. Должно быть довольно просто найти цепочку вызовов функций, если исключение правильно набрано и соответствующее сообщение содержит достаточно подробные данные (лично мне не нравится включать трассировки стека, но я знаю много, кто это делает, и это сделало бы это даже более отслеживаемый.) Для реализации кода возврата требуется внешняя таблица определений кода для каждой программы. Который из личного опыта неудобен в обращении и справочнике.

0 голосов
/ 15 сентября 2008

try / catch / наконец делает работу превосходно.

Позволяет программисту корректно обрабатывать как определенные условия, так и общие сбои.

Все сказано и сделано, я уверен, что каждый из них так же хорош, как и любой другой.

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