Використання 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 .