Cześć wszystkim
Obsługa błędów w C jest raczej schematyczny -> tzn. wyrażenie if
+ ewentualne wyjście z programu. Za każdym razem jak implementuję taką obsługę błędów robię to raczej z grymasem na twarzy aniżeli cieszę się, że program wykryje wszystkie błędy i odpowiednio na nie zareaguje. Dlaczego? Dlatego, że po zaimplementowaniu obsługi błędów powstaje coś takiego na przykład:
static void server_listening_init(int *listen_socket, struct conf *config, struct sockaddr_in *server_addr) {
*listen_socket = socket(AF_INET, SOCK_STREAM, 0);
if ((*listen_socket) < 0) {
print_error_and_exit("Creating listening socket");
}
FILE *config_file = open_file("ports.conf", CONF_DIR, strlen("ports.conf"), strlen(CONF_DIR));
if (config_file == NULL) {
print_error_and_exit("Opening config file");
}
fset_conf_state(config_file, config, "PORT:");
if (!port_is_valid(config)) {
fprintf(stderr, "%s\n", "Listening port is not valid. Try to use port from 1024 to 49151 (user ports).");
exit(EXIT_FAILURE);
}
init_address_struct(server_addr, config);
#ifdef DEBUG
int optval = 1;
if (setsockopt(*listen_socket, SOL_SOCKET, (SO_REUSEADDR | SO_REUSEPORT), &optval, sizeof(optval)) < 0) {
print_error_and_exit("Listening socket option");
}
#endif
int binding_error = bind(*listen_socket, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (binding_error) {
print_error_and_exit("Binding listening socket");
}
if (listen(*listen_socket, 5) < 0) {
print_error_and_exit("Listen socket");
}
fclose(config_file);
}
Chodzi o to, że kod funkcji bardzo się wydłuża przez te if'y łapiące błędy. Jest inna opcja, żeby te błędy obsługiwać czy muszę tak to zostawić?