2013-01-01 12 views
18

Napisałem prostą aplikację, która odczytuje plik danych, analizuje tekst, a następnie przetwarza dane. Plik danych zostanie otwarty w mojej funkcji main(). Czy dobrą praktyką programistyczną jest użycie funkcji exit(), jeśli zostanie stwierdzone, że plik nie został poprawnie otwarty? np .:Prawidłowe użycie exit() w języku C++?

if (!file.is_open()){ 
    exit(1); 
} 

Ponadto mój program ma osobną funkcję do analizy danych w pliku. Ta funkcja jest wywoływana przez main(). Jeśli funkcja wykryje błąd w danych, chcę zatrzymać program po wydrukowaniu komunikatu o błędzie. W takiej sytuacji dopuszczalne jest użycie funkcji exit() w ramach mojej funkcji parsowania? Zadaję to pytanie, ponieważ dla mnie wydaje się, że nie jest bardzo dobrze, aby funkcja mogła wyjść z programu na własną rękę bez zwracania kontroli do funkcji main(). (Przepraszam, jeśli to pytanie wydaje się dość oczywiste .. Jestem nowy w C++ i programowaniu w ogóle).

+0

Nie rozumiem pytania. Czy masz zamiar normalnie zakończyć program? Bo jeśli tak, nie ma niczego złego, co mogę tu zobaczyć. – Rapptz

Odpowiedz

3

exit(0) wskazuje zakończenie & udany program jest w pełni przenośny, ile

exit(1) (zazwyczaj) wskazuje na zakończenie unsucessful. Jednak jego użycie jest nieprzenośne.

+0

Czy możesz podać przykład, w którym jego użycie jest nieprzenośne? – Rapptz

+0

@Rapptz: Zostało to omówione na końcu [tej odpowiedzi] (http://stackoverflow.com/a/8696712/78845). – Johnsyweb

+0

@Johnsyweb dziękuję. Wiedziałem o różnicy między 'return 0' i' return n' with n! = 0, ale nie było jasne, w jaki sposób zastosował się do 'std :: exit', więc teraz już wiem. – Rapptz

1

Od main nie ma różnicy w exit(1) lub return 1. Używasz wartości zwrotu/wyjścia wynoszącej 0 dla sukcesu i non0 z powodu niepowodzenia.

Jeśli twój podprogram jest procedurą biblioteczną, która jest używana gdzieś indziej, powinna zwrócić kontrolę do głównej z pewnym kodem powrotu lub wyjątkiem. W przeciwnym razie to twój wybór, jeśli jesteś exit lub powrócić.

W obu przypadkach dobrą praktyką jest udokumentowanie działania tej funkcji, np. exit, return lub exception.

1

To zależy od tego, skąd pochodzi exit(1). Nie powinieneś nazywać tego exit(1) z biblioteki, tylko z własnej aplikacji.

Jeśli musisz ustawić kod błędu, możesz ustawić errno (zmienna STD C, tak).

Jeśli chcesz wypróbować bardziej C++, możesz rzucić wyjątek ze szczegółowym kodem błędu.

14

Wywołanie exit z funkcji nie jest "złe" w tym sensie, że ma dobrze zdefiniowane zachowanie - nie ma w tym nic zasadniczo złego.

Ale jeśli piszesz funkcję, która może na przykład znaleźć się w bibliotece, wywołanie exit z ogólnie złej praktyki: znacznie lepiej jest zasygnalizować błąd kodowi wywołującemu (przez określony zwrot wartość lub wyjątek na przykład) i niech kod wywołujący zdecyduje, co zrobić. (Są jednak przypadki, gdy jest to całkowicie poprawne, np. Jeśli piszesz funkcję o nazwie quit_if_file_not_found, cóż, twoi użytkownicy oczekują zakończenia.)

W twoim przypadku funkcja analizy parsowania prawdopodobnie nie powinna wywoływać exit: ty może na przykład chcieć, na przykład, w pewnym momencie w przyszłości, swój główny kod, aby zapytać użytkownika o inną nazwę pliku, jeśli parsowanie pierwszego nie powiodło się. Jeśli twoja procedura analizowania kończy program, musisz zmodyfikować zarówno główny kod, jak i tę funkcję. Jeśli zasygnalizowałby warunek błędu, wystarczy zmodyfikować logikę w main.

(I nie tylko exit bez drukowania komunikat o błędzie lub zalogowaniu coś takiego robisz powyżej, które uczynią dla sfrustrowanych użytkowników, którzy nie mogą wiedzieć, jak rozwiązać problem, co to jest kod spotkałem.)

+0

Moje funkcje zwracają typ jest nieważny .. więc nie mogę zwrócić niczego, co zasygnalizuje błąd . – mahela007

+2

Cóż, musisz to zmienić, użyć "parametru wyjściowego" lub użyć wyjątków. Funkcja, która może zawieść i nie może sygnalizować błędu, jest błędem projektowym. – Mat

6

Istnieją dwa aspekty. Jednym z nich jest podjęcie decyzji o zatrzymaniu programu w miejscu, z którego chcesz korzystać, exit, drugim jest użycie wyjścia. Mat's answer obejmuje pierwszy.

Po drugie, exit jest zwykle złym wyborem w C++. Powodem jest to, że robi pewne czyszczenie (funkcje zarejestrowane w atexit i które czasem zawierają destruktory niektórych obiektów o statycznym czasie przechowywania), ale nie wszystkie z nich (destruktory obiektów na stosie) i według mojego doświadczenia chcesz tego wszystkiego. lub brak.

1

Wyjście jest dopuszczalne, chociaż uważam, że ważne jest, aby zwrócić uwagę na różnice w pamięci użycia exit vs. return w tym wyjściu, które nie niszczy zmiennych w pamięci. Jeśli wystąpi błąd, wyjście jest uzasadnione. W przeciwnym razie trzymałbym się oświadczenia zwrotu.

Powiązane problemy