Frage von DAUUSER, 24

throw new IllegalArgumentException in C?

Hallo, ich habe ein Progamm in C geschrieben und möchte dort das man keine negativen Zahlen eingeben, kann in Java gibt es ja so was

( If satement) throw new IllegalArgumentException

gibt es so was auch in C ?

Expertenantwort
von TeeTier, Community-Experte für programmieren, 6

In C gibt es keine Exceptions, aber in C++ kannst du so etwas wie ...

throw runtime_error("Aaaahhhhhh!");

schreiben. Du kannst zwar auch ...

throw new runtime_error("OMG!");

... schreiben, aber anders als in Java macht das dann nicht genau das, was du denkst, und hat neben schlechtem Stil auch viele gefährliche Nachteile.

Zurück zu C: Wenn du dir für etwas Makro-Zauberei nicht zu schade bist, dann kannst du dir auch Exceptions in C mit nur zwei bis drei Zeilen Code zusammen frickeln. Das hat dann zwar nicht mal Ansatzweise den Komfort von Java- oder C++-Exceptions, und basiert auf setjmp() und longjmp(), aber immerhin kannst du dann so etwas schreiben:

TRY {
if (foo()) {
THROW(123);
}
} CATCH {
printf("Exception %d caught!\n", EXCEPTION);
}

Dabei sind TRY, THROW, CATCH und EXCEPTION allesamt Makros. Diese Einfache Form des Exception-Handlings in reinem ANSI C benötigt pro Makro tatsächlich nur eine einzige Zeile, kann aber auch nur Integer als Error-Codes werfen.

Wenn du mehr Komfort willst, such bei Google einfach nach "c exception handling" oder so. Dort findest du richtig schicke Bibliotheken, die die Möglichkeiten von Java und C++ oder gar Python teilweise übersteigen. Sei dir aber dabei immer bewusst, dass du dafür oft einen Runtime-Overhead bezahlst, und die Abhängigkeiten deines Projektes erhöhst! Ist es das Wert?

Wenn es dir um ANSI-C geht, ist folgender Ansatz evtl. sauberer:

int foo(const char *str) {
int ok = (NULL != str);

if (ok) {
ok = (123 == qux(str));
}

if (ok) {
int lorem = ipsum();

ok = (lorem < 64 && oink(str, lorem));
}

return ok;
}

Das ist zwar arg verkürzt, aber das Ganze gibt es auch noch mit "goto", und der Linux-Kernel-Code sieht ähnlich aus, aber immerhin kann man auf diese Art und Weise verschachtelten Code linearisieren, und sehr schick auf Fehlercodes prüfen.

Schönen Abend noch! ;)

PS: Der Vollständigkeit halber sei noch auf errno und strerror() verwiesen! :)

Antwort
von 3v1lH4x0R, 8

Es gibt in C keine Exceptions. Daher auch kein throw. Außerdem keine Klassen. Also kein new.

Häufig werden Fehler durch den Rückgabewert der Methode mitgeteilt. Zum Beispiel durch eine negative Zahl wie zB -1.

Fehler abzufragen und zu vermeiden ist dann Aufgabe des Aufrufenden.

Keine passende Antwort gefunden?

Fragen Sie die Community