Использование exit()нормально
Два основных аспекта разработки кода, которые еще не упоминались, - это «многопоточность» и «библиотеки».
В однопоточной программе в коде, который вы пишете для реализации этой программы, можно использовать exit(). Мои программы используют его регулярно, когда что-то пошло не так, и код не собирается восстанавливаться.
Но…
Однако звонок exit()- это одностороннее действие, которое нельзя отменить. Вот почему и «потоки», и «библиотеки» требуют тщательного обдумывания.
Потоковые программы
Если программа многопоточная, то использование exit()- это драматическое действие, которое завершает все потоки. Вероятно, будет неуместно выходить из всей программы. Может быть целесообразно выйти из потока, сообщив об ошибке. Если вы знакомы с дизайном программы, то, возможно, такой односторонний выход допустим, но в целом он неприемлем.
Код библиотеки
И этот пункт о «осведомленности о структуре программы» применим и к коду в библиотеках. Вызывать библиотечную функцию общего назначения бывает очень редко exit(). Вы были бы справедливо расстроены, если бы одна из стандартных функций библиотеки C не вернулась только из-за ошибки. (Очевидно, что функции , как exit(), _Exit(), quick_exit(), abort()предназначены не для возвращения, то по - другому.) Функции в библиотеке C , следовательно , либо «не может не» или вернуть индикацию ошибки так или иначе. Если вы пишете код для использования в библиотеке общего назначения, вам необходимо тщательно продумать стратегию обработки ошибок для вашего кода. Он должен соответствовать стратегиям обработки ошибок программ, с которыми он предназначен для использования, или обработка ошибок может быть настраиваемой.
У меня есть ряд библиотечных функций (в пакете с заголовком "stderr.h", имя, которое ступает по тонкому льду), которые предназначены для выхода, поскольку они используются для сообщения об ошибках. Эти функции выходят по назначению. В том же пакете есть связанная серия функций, которые сообщают об ошибках и не завершаются. Существующие функции, конечно же, реализованы в терминах неоткрывающихся функций, но это внутренняя деталь реализации.
У меня есть много других библиотечных функций, и многие из них полагаются на "stderr.h"код для сообщения об ошибках. Это дизайнерское решение, которое я принял, и с ним я согласен. Но когда об ошибках сообщают функции, которые выходят, это ограничивает общую полезность кода библиотеки. Если код вызывает функции сообщения об ошибках, которые не завершаются, тогда основные пути кода в функции должны иметь дело с возвратами ошибок разумно - обнаруживать их и передавать сообщение об ошибке в вызывающий код.
Код моего пакета отчетов об ошибках доступен в моем репозитории SOQ (Stack Overflow Questions) на GitHub в виде файлов stderr.cи stderr.hв подкаталоге src / libsoq .