C obsługiwanie niespodziewanych błędów

0

siema jeszcze jeden dylemat na dzisiaj. Czy obsługuje się w C niezaplanowane mało prawdopodobne błędy? Tzn gdy w jakieś funkcji wystąpi błąd, który uniemożliwia dalsze działanie programu można dać exit(EXIT_FAILURE); olewając niepozamykane rzeczy, niezwolnioną pamięć itd... czy może trzeba to wszystko obsłużyć? np. zwracając z funkcji czy się udało i w funkcji, która to wywołała obsłużyć (tj. zwolnić pamięć, wszystko pozamykać (deskryptory, sysloga itd...) itd...)? jak wy to robicie hmm? poniżej prosty przykład o co mi chodzi

/* zwracam czy się udało czy nie i w funkcji, która to wywołała obsługuję */
int f1(const char *jakis_string, struct costam *costam) {
	char *sfp = strdup(jakis_string);
	if(!sfp) {
		fprintf(stderr, "can't allocate memory in f1\n");
		return 0;
	}
	costam->jakis_string = sfp;
	return 1;
}

/* nieobsłguję tylko zamykam hamsko program */
void f2(const char *jakis_string, struct costam *costam) {
	char *sfp = strdup(jakis_string);
	if(!sfp) {
		fprintf(stderr, "can't allocate memory in f2\n");
		exit(EXIT_FAILURE);
	}
	costam->jakis_string = sfp;
}
/* wgl nie przewiduję takiego scenariusza */
void f3(const char *jakis_string, struct costam *costam) {
	costam->jakis_string = strdup(jakis_string);
}

Pozdrawiam

1

exit() - wszystko zwalnia i zamyka.
Aczkolwiek jeżeli później ubzdurasz sobie to jednak obsłużyć to będziesz mieć problemy z niezamkniętymi zasobami i nie zwolnioną pamięcią bo już nie pamiętasz: gdzie, co, jak.

0

@_13th_Dragon dzięki, czyli mogę sobie stosować poniższy wariant i się nie martwić? :)

void f2(const char *jakis_string, struct costam *costam) {
    char *sfp = strdup(jakis_string);
    if(!sfp) {
        fprintf(stderr, "can't allocate memory in f2\n");
        exit(EXIT_FAILURE);
    }
    costam->jakis_string = sfp;
}
1

Jeżeli nigdy więcej nie dotkniesz tego projektu ani użyjesz żadnego jego fragmentu w innym projekcie to nie musisz się martwić.
Z tym że nigdy nie mów nigdy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1