FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

Java try/catch nicht als Kontrollsturktur missbrauchen - wieso?

Java try/catch nicht als Kontrollsturktur missbrauchen - wieso? 2010-11-24 11:39
Blup
Moin. Haette da eine Frage an euch.

Ich meine mich dunkel daran erinnern zu koennen, dass in SE mal gesagt wurde, dass try/catch Bloecke ausschliesslich der Fehlerbehandlung dienen und nicht als Kontrollsturktur missbraucht werden duerfen. Erinnere ich mich da richtig?

Falls ja, warum ist das so? Wie gehe ich vor, wenn ich im Fehlerfall einen Alternativplan einschlagen moechte und nicht die Moeglichkeit habe schlicht irgendwas auf null zu testen?

RE: Java try/catch nicht als Kontrollsturktur missbrauchen - wieso? 2010-11-24 12:09
Wulf
if(foo == null) {
stmt0;
} else {
stmt1;
}

ist besser als:

try {
foo.noop;
stmt0;
} catch(Exception e)
{
stmt1;
}

ist es das, was du meintest?
Hinweis: null ist nicht zwangsläufig ein Fehler.

RE: Java try/catch nicht als Kontrollsturktur missbrauchen - wieso? 2010-11-24 12:16
Anonymer User
So in etwa, ja. Das Problem ist, dass ich eine sehr abgeschlossene Schnittstelle habe, bei der ich im Fehlerfall keinen Rueckgabewert (z.B. null) bekomme sondern lediglich eine Exception.

Die Frage ist, ob ich auf das sichere Ausfuehren des catch Blocks vertrauen und dort etwa einen boolean von true auf false setzen kann um weitere Massnahmen einleiten zu koennen.

RE: Java try/catch nicht als Kontrollsturktur missbrauchen - wieso? 2010-11-24 12:43
Wulf
Wenn alles was du kriegen kannst eine Exception ist, musst du wohl try/catch nutzen.

bool fail = false;
try {
foo.bar();
} catch(Exception e) {
fail = true;
}

if(fail) {
}

finde ich persönlich ok.

RE: Java try/catch nicht als Kontrollsturktur missbrauchen - wieso? 2010-11-24 13:46
Anonymer User
Oder du baust eine eigene Exception und benutzt "throw" im Fehlerfall?

RE: Java try/catch nicht als Kontrollsturktur missbrauchen - wieso? 2010-11-24 15:32
Anonymer User
Danke erstmal Wulf, ich werde noch einbisschen googlen und schauen, wer sich hier noch alles zu Wort meldet.

Oder du baust eine eigene Exception und benutzt "throw" im Fehlerfall?

???

RE: Java try/catch nicht als Kontrollsturktur missbrauchen - wieso? 2010-11-24 18:12
NaZo
Ein Grund, weshalb man try/catch-Blöcke nicht als Kontrollstruktur missbrauchen soll, ist, dass sie dafür schlicht und ergreifend nicht da sind. Es erhöht einfach ungemein die Verständlichkeit des Quelltextes, wenn Sprachkonstrukte für das benutzt werden, wofür sie da sind. Wenn ein anderer Entwickler irgendwann den Code sieht, soll er erkennen können, was da passiert. Und eine try/catch-Block sagt ihm, hier findet eine Ausnahmebehandlung statt. Für reguläre Verzweigungen sind if/then/else-Blöcke da.
Nun kann man im konkreten Fall natürlich darüber streiten, was ein regulärer Programmpfad und was ein Ausnahmefall ist. Ist z.B. eine fehlerhafte Benutzereingabe eine Ausnahme oder nicht? In vielen Fällen hängt das sicher auch vom jeweiligen Kontext ab, z.B. sind bei freien Textfeldern ungültige Eingaben genauso wahrscheinlich wie richtige. Bei DropDown-Feldern ist eine fehlerhafte Eingabe eher eine Ausnahme.

Wenn man eine Methode aufruft, die im Fehlerfall eine Exception wirft, kann, soll und muss man natürlich eine entsprechende Fehlerbehandlung im catch-Block vorsehen (es sei denn, man will sie einfach weiterwerfen). Kommt es zu dieser Exception, wird dieser natürlich auch ausgeführt.
Eine Konstruktion wie in Wulfs Beispiel finde ich persönlich nicht so schön. Ich würde ein schlichtes try { foo.bar(); } catch(Exception e) { //do something } bevorzugen.

Ist der Fehler vorhersehbar, weil er z.B. nur auftritt, wenn eine bestimmte Vorbedingung nicht erfüllt ist, sollte man die Vorbedingung natürlich testen, bevor man die Methode überhaupt aufruft. Aber bei solchen Fehlern sollte eigentlich auch eher eine RuntimeException geworfen werden, die keinen try/catch-Block erzwingt, da ihnen schließlich Programmierfehler zugrunde liegen, wenn sie trotz Vermeidbarkeit auftreten.

RE: Java try/catch nicht als Kontrollsturktur missbrauchen - wieso? 2010-11-24 18:36
Anonymer User
Diese Grundlegenden Dinge sind mir schon klar. Die Frage ist vielleicht etwas missverständlich formuliert: Ist die try/catch methode genauso zuverlässig wie eine if/else Anweisung? Da es keinerlei Andeutungen in diese Richtung gab gehe ich jetzt mal davon aus. Google brachte auch nichts ähnliches.

RE: Java try/catch nicht als Kontrollsturktur missbrauchen - wieso? 2010-11-25 08:20
Anonymer User
Danke erstmal Wulf, ich werde noch einbisschen googlen und schauen, wer sich hier noch alles zu Wort meldet.

Oder du baust eine eigene Exception und benutzt "throw" im Fehlerfall?

???

Er meint wohl so was wie:
http://www.programmersbase.net/Content/Java/Content/Tutorial/Java/Exception.htm

RE: Java try/catch nicht als Kontrollsturktur missbrauchen - wieso? 2010-11-25 11:03
NaZo
Ist die try/catch methode genauso zuverlässig wie eine if/else Anweisung?
Ich weiß nicht genau, worauf Du hinaus willst. Natürlich funktioniert das Konstrukt so, wie es soll. Wäre ja schlimm, wenn nicht. Also, wenn eine Exception geworfen wird, wird der catch-Block ausgeführt. Wann und wie eine Exception geworfen wird, hängt natürlich vom verwendeten Dienstleister ab. Aber eigentlich sollte man davon ausgehen können, dass der sich so verhält, wie in seiner Schnittstelle beschrieben. Schlampigkeit und Bugs kann es natürlich immer geben, aber darauf sollte man seinen eigenen Code nicht ausrichten.

Allerdings soll der Fall, dass eine Exception geworfen wird, nur eintreten, wenn etwas schief läuft. Und wieso soll man sich irgendwo darauf verlassen wollen, dass etwas schief läuft? Das ergibt doch keinen Sinn. Man geht doch eigentlich davon aus, dass alles richtig funktioniert, und für den Fall, dass doch nicht, definiert man seine Ausnahmebehandlung im catch-Block.

Oder du baust eine eigene Exception und benutzt "throw" im Fehlerfall?

???
public void foo() throws MyException {    try    {       //do something    }    catch (SomeException e)    {       throw new MyException();    } }

RE: Java try/catch nicht als Kontrollsturktur missbrauchen - wieso? 2010-11-25 13:00
Anonymer User
Danke erstmal Wulf, ich werde noch einbisschen googlen und schauen, wer sich hier noch alles zu Wort meldet.

Oder du baust eine eigene Exception und benutzt "throw" im Fehlerfall?

???

Er meint wohl so was wie:
http://www.programmersbase.net/Content/Java/Content/Tutorial/Java/Exception.htm

Was ich meinte war: Ich sehe nicht, wie mich das vom try/catch-Block Problem wegführen soll.


Allerdings soll der Fall, dass eine Exception geworfen wird, nur eintreten, wenn etwas schief läuft. Und wieso soll man sich irgendwo darauf verlassen wollen, dass etwas schief läuft? Das ergibt doch keinen Sinn

Tut es in diesem Fall ob der doofen API. Analysiere ein Bild nach einem bestimmten Muster. Wurde dieses Muster gefunden, liefere mir die Koordinaten. Schlägt die Suche fehl, wird eine Exception geworfen.


Aber naja, die Frage wurde beantwortet. Ich danke euch!

RE: Java try/catch nicht als Kontrollsturktur missbrauchen - wieso? 2010-11-25 13:13
Fred
Analysiere ein Bild nach einem bestimmten Muster. Wurde dieses Muster gefunden, liefere mir die Koordinaten. Schlägt die Suche fehl, wird eine Exception geworfen.
[28]

RE: Java try/catch nicht als Kontrollsturktur missbrauchen - wieso? 2010-11-25 16:52
garou
Analysiere ein Bild nach einem bestimmten Muster. Wurde dieses Muster gefunden, liefere mir die Koordinaten. Schlägt die Suche fehl, wird eine Exception geworfen.
Wurde das Muster gefunden, gib' eine Liste der Koordinaten zurück, an denen es gefunden wurde. Wurde es nicht gefunden, gib' eine leere Liste zurück. Wurde das Bild nicht gefunden, *dann* wirf' eine exception.

RE: Java try/catch nicht als Kontrollsturktur missbrauchen - wieso? 2010-11-25 19:00
Anonymer User
Ja fein. Nur habe ich keinen Einfluss auf diesen Prozess. Es wird eine Exception geworfen und eben keine leere Liste zurückgegeben. Noch genauer, ich bekomme nichtmal die Koordinaten sondern es wird direkt eine vorher festgelegte Aktion (z.B Mausklick) ausgeführt.

Ich habe die Mustererkennung nunmal nicht geschrieben. Natürlich könnte ich mich da einarbeiten und daran rumbasteln, aber diese Arbeit wollte ich vermeiden. Wenn try/catch zuverlässig ausgeführt wird, brauche ich es ja auch nicht.

RE: Java try/catch nicht als Kontrollsturktur missbrauchen - wieso? 2010-11-26 10:45
NaZo
Klassisches Beispiel für Missbrauch des Exception-Mechanismus.

Aber klar, wenn die API so ist, musst Du entsprechend damit umgehen und dann kommst Du um try/catch nicht herum. Damit Dein eigentlicher Code schöner bleibt, gäbe es noch die Möglichkeit das try/catch-Prozedere in einer Wrapper-Klasse zu kapseln, die Dir die Dienstleistung der Bilderkennung mit einer vernünftigen Schnittstelle anbietet.

RE: Java try/catch nicht als Kontrollsturktur missbrauchen - wieso? 2010-11-28 23:59
Hannes
[offtopic]I put my call to your biatch API in a try – my code will never die.[/offtopic]