2012-04-13 5 views
1

Viele Male in meinem Code zu vermeiden Ich habe Blöcke wie folgt aus:Wie stylen oder mehrere Funktionsrückgabe Kontrollen in einem Codeblock

close(READ); 
dup(fd[READ]); 
close(fd[READ]); 
execl("ay", "bee", NULL); 

Wie kann ich vermeiden, dass ein Bündel von

if (close(READ) == -1) { 
    perror("close"); 
    exit(EXIT_FAILURE); 
} 
...repeat for each function... 

Oder was ist eine gute Praxis, um damit umzugehen?

Ich habe versucht, so etwas wie diese:

void test_returns(int result, char * err) { 
    if (result == -1) { 
     perror(err); 
     exit(EXIT_FAILURE); 
    } 
} 

/* code */ 
test_returns(close(READ), "close"); 
test_returns(dup(fd[READ]), "dup"); 
test_returns(close(fd[READ]), "close"); 
test_returns(execl("ay", "bee", NULL), "execl"); 

Aber ich denke, das ist kein guter Weg ist, darüber zu gehen. Was ist eine gute Lösung dafür?

+0

Normalerweise möchten Sie nicht sofort beenden, wenn ein Fehler auftritt, sondern nur einen Fehlercode von der aktuellen Funktion zurückgeben. In jedem Fall können Sie die 'if's nicht vermeiden (außer mit Makros, aber das könnte wirklich hässlich werden). –

Antwort

0

Wie beschrieben, löst die Funktion test_returns das Problem nicht, da immer noch Code zur Fehlerüberprüfung mit Ihrer Geschäftslogik gemischt ist. Sie sollten einen Schritt weiter gehen:

void test_returns (int result, char * err) { 
    if (result == -1) { 
     perror(err); 
     exit(EXIT_FAILURE); 
    } 
} 

void CLOSE (int fd) { test_returns(close(fd), "close"); } 
void DUP (int fd) { test_returns(dup(fd), "dup"); } 
#define EXECL(path, arg, ...) do { test_returns(execl(path, arg, __VA_ARGS__), "execl"); } while (0) 

Dann Sie Ihren Code wie folgt schreiben:

CLOSE(READ); 
DUP(fd[READ]); 
CLOSE(fd[READ]); 
EXECL("ay", "bee", NULL); 

, die viel mehr lesbar ist. Angesichts der Einfachheit von test_returns möchten Sie es vielleicht direkt in die verschiedenen Wrapper integrieren. Das ist eine Frage der Präferenz.

Verwandte Themen