Exception werfen oder Bedingung prüfen?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Eine Exception soll immer einen unerwarteten Fehlerzustand widerspiegeln. Dass ein ungültiger Wert im Parameter kommt ist aber erwartbar und sollte somit nicht zu einer Exception führen, zumal das Werfen von Exceptions eine teure Operation ist.

In Deinem Fall soll die Methode ja gerade prüfen, ob ein Int eine bestimmte Bedingung erfüllt. Also würde ich als Entwickler, der Dein "API" nutzt sogar erwarten, dass diese Methode einen Bool liefert.

Es liegt also in der Verantwortung des Objektes, welches die Methode ruft, vorher zu prüfen, ob die Parameter die Bedingungen erfüllen?

Wann würde ich denn dann überhaupt selber eine Exception schmeißen? Könnte mir dann nur so etwas vorstellen wie ein unerwartetes Ergebnis nach einem Algorithmus oder so was.

0
@Crysali

Nein. Pass acht. Im obigen Fall hast Du ja die Wahl eine Funktion zu schreiben, welche dein Eingabeparameter prüft und dann ein Bool-Ergebnis zu liefern, oder eine Methode ohne Ergebnis, welche eine Exception wirft, wenn es nicht passt.

Letzteres wäre aus meiner Sicht ganz schlechtes Design, denn die Funktion soll mir ja gerade sagen ob das Ergebnis gültig ist oder nicht. Dazu muss sie aber keine Exception schmeißen.

^--- OK, auf Basis des neuen Kommentars, den Du geschrieben hast, während ich das hier schrieb, ist das ja nicht mehr aktuell.

Anders liegt beispielsweise der Fall, wenn Du eine Methode hast, welche eine Datei einlesen soll. Ja, auch hier würde ich als Aufrufer erst einmal prüfen, ob die Datei überhaupt existiert. Aber dann können im Laufe des Öffnungsprozesses ganz viele Fehlerbedingungen auftreten, welche eben nicht im Vorfeld geprüft werden können (z.B: die Datei liegt auf einer USB-Platte und die wird abgezogen während des Lesens, etc.). DANN wird eine Exception geworfen.

Oder: Du schreibst eine Komponente, welche Closed Source ist und welche von anderen Entwicklern verwendet werden kann. Da hast Du eine Property, welche aber nur bestimmte Werte annehmen darf. Da würde ich natürlich beim Setzen eines ungültigen Wertes eine Exception schmeißen. Warum? Weil dann der andere Entwickler die Möglichkeit hat zu prüfen, warum der Wert außerhalb der Grenzen ist und ggf. hier eine Prüfung einzubauen.

Generell sollte das Ziel sein, möglichst wenige Exceptions überhaupt zu bekommen. Sprich: Was man um Vorfeld prüfen kann, prüfe man im Vorfeld. Exceptions die dann noch auftreten sind entweder höhere Gewalt oder können durch weitere Vorprüfungen eliminiert werden.

Exceptions zur Steuerung des Programmflusses zu verwenden ist jedoch ein absolutes No-Go!


1
@Crysali

Wann würde ich denn dann überhaupt selber eine Exception schmeißen? 

Sehr gute Frage! Selbst braucht man sie eigentlich so gut wie nie werfen. Abfangen oder durchreichen muss man sie allerdings schon des öfteren.

1
@Suboptimierer

Naja, ein möglicher Fall ist wie gesagt, wenn man selbst eine Bibliothek, Komponente, etc. schreibt und diese vertreibt. Dann wird man sicherlich ab und zu mal eine ArgumentException werfen.

0
@ohwehohach

Okay, vielen Dank, jetzt ist es mir klar geworden!

0
In Deinem Fall soll die Methode ja gerade prüfen, ob ein Int eine bestimmte Bedingung erfüllt. Also würde ich als Entwickler, der Dein "API" nutzt sogar erwarten, dass diese Methode einen Bool liefert.

Nein, da habe ich mich nicht klar genug ausgedrückt, das wäre vergleichbar mit https://msdn.microsoft.com/en-us/library/f02979c7(v=vs.110).aspx

Der boolean dient nur dazu, dass man weiß, ob es erfolgreich war oder nicht, es ist nicht das Ziel der Methode, diesen boolean zu erzeugen, also den Integer zu prüfen, sondern etwas auszuführen, nachdem er geprüft wurde, beispielsweise die Zahl konvertieren oder so was.

Sonst würde ich natürlich keine Exception schmeißen, wenn es der Zweck der Methode wäre, den Integer auf Bedingungen zu prüfen, sicher.

0
@Crysali

Du willst also wissen, ob Du den Integer weiterverarbeiten kannst und deswegen prüfst Du den Wert.

Da Du einen Integer mit der Methode übergibst und dann prüfst, welchen Wert der Integer hat, kann hier keine Exception entstehen.

Eine Exception ist sowieso in deinem Beispiel nicht nötig.

Oder was willst Du dann mit der Exception machen?

0

Es gibt keine generelle Regel, wann was sinnvoller ist.

Eine Ausnahme erfordert von der Laufzeitumgebung ziemlich viel Aufwand und Speicherplatz, ist also "teuer", außerdem erfordert sie, dass der Verwender der Methode darüber informiert wird und sich darauf vorbereiten kann. Eine interne Fallbehandlung erfordert einen (zusätzlichen) Rückgabeparameter, der über Erfolg oder Misserfolg Auskunft gibt - das hast du im 1. Beispiel ja so umgesetzt.

Eine Ausnahme bedeutet, dass man dem Aufrufer kräftig auf die Finger klopft und dabei sagt "Du hast hier etwas gemacht, was man nicht tut! Schäm dich!"

Bei Zugriff auf ein Element eines Array über den Index, wo der Verwender des Arrays die Größe leicht auslesen kann oder sogar selbst festgelegt hat und diese Größe sich nicht "von allein" ändert, ist eine Ausnahme durchaus angemessen.

Bei Suche eines Elements in einem Array (oder auch einer sortierten Liste etc.) ist eine Ausnahme unangemessen, da hier der übliche Fall ist, dass der Anwender der Methode nicht vorher weiß, ob das Array das Element enthält (oder ein Element, auf das eine Bedingung passt). Hier ist eine Ausnahme eine Frechheit. (Ich kenne als Lösung, dass bei 0-basierten Arrays im Fehlerfall ein "Index" < 0 zurückgegeben wird.)

Also: Überleg dir, ob der Programmierer, der deine Methode aufruft, leicht vor dem Aufruf in Erfahrung bringen kann, ob sein Wert passt, d. h. ob es ihm als Faulheit angekreidet werden kann, wenn er es nicht tut, oder er annehmen darf, dass deine Methode auch genau dazu dient, die Überprüfung der Bedingung vorzunehmen.

Das mit dem "dem Anwender der Methode auf die Finger klopfen" stimmt so auch nicht in allen Fällen:

man schreibt z. B. in eine Datei, und plötzlich zieht jemand den USB-Stick heraus, auf dem die Datei sitzt. Auch hier ist eine Ausnahme angebracht - aber die kann und sollte man bis ganz nach oben durchreichen und dem Anwender der gesamten Anwendung eine Meldung quer über den Bildschirm geben oder bei Hintergrunddiensten eine deutliche Beschwerde ins Log schreiben.

0

Exceptions, also Ausnahmen, sollte immer eine Ausnahme sein udn nicht der Standard. Sie werden dann geworfen, wenn etwas passiert, was nicht ohne weiteres bereinigt werden kann etc. .

Man könnte es eventuell auch so sagen:

Wenn ich vor Ort der Fehler nicht beheben und auch nicht mehr ohne weiteres an den übergeordneten Code kommunizieren kann, dann wird es Zeit eine Exception zu werfen.

Ein einfaches Beispiel, eine Sequence/Container, ich programmiere etwas à la:

variable=sequence[#positional]

Ist positional außerhalb des zulässigen Bereichs, dann kann der Container nur noch eine Exception werfen, oder aber der Rückgabewert müßte wohldefiniert für einen Fehler stehen.

In stark typisierten Sprachen kommt man in einem solchen Szenario kaum um eine Exception herum.

Natürlich sollte der Code, der variable=sequence[#positional] aufruft, davor prüfen, ob das Positionsargument innerhalb des korrekten Intervalls ist, tut er das nicht, dann entsteht eben eine Ausnahme.

Der Vorteil ist, daß die Ausnahme propagiert, wäre dies also in einer Bibliothek, dann wandert die Ausnahme weiter und kann im Programm, daß die Bibliotheksfunktion aufruft, gefangen werden, auch wenn die korrekte Behandlung innerhalb der Bibliothek fehlte.

Wofür Switch case?

Warum sollte ich nen switch verwenden anstatt einfach if und else if?

    switch ($variable) {
        case '1':
            # code...
            break;
        case '2':
            # code...
            break;    
        default:
            # code...
            break;
    }

verglichen mit if Verzweigungen ist das doch viel länger

    if($variable == 1) echo 1;
    else if($variable == 2) echo 2;
    else echo 3;
...zur Frage

Eine Wahrscheinlichkeit aus einer Vielzahl Wahrscheinlichkeiten ermitteln?

Ich habe eine Anzahl von Wahrscheinlichkeiten, die jeweils mit einem Objekt verknüpft sind, und möchte nun eine zufällige Zahl würfeln, mit deren Hilfe ich eindeutig ein Objekt anhand dessen Wahrscheinlichkeit ermitteln kann.

Nach ein bisschen Überlegen habe ich so etwas in der Art ( natürlich besser, in Form einer Schleife, die die Objekte durchläuft, aber das gleiche Prinzip):

int number = random(1,101); 
if(number<5) // 5% chance
    return 2;
else if (number <55) // 55% chance ?
    return 8;

Was mich aber gerade verrückt macht, ist die Überlegung, das das doch gar nicht richtig sein kann ? Ich durchlaufe die Wahrscheinlichkeiten von der kleinsten Wahrscheinlichkeit mit zur größten Wahrscheinlichkeit.

Beispiel: Ich habe die Wahrscheinlichkeiten 5%, 25% und 75% ( müssen die Wahrscheinlichkeiten für diese Logik zusammen 100 ergeben ?). Ich ermittle nun eine zufällige Zahl zwischen 1 und 100.

Ist die Zahl kleiner gleich 5, ist die 5% erfüllt. Würde ich aber jetzt einfach bei Zahl größer 5 und kleiner gleich 25 die 25% als erfüllt sehen, hätte ich doch eigentlich nur eine 20% Wahrscheinlichkeit, dass die 25% eintreten und erst wieder für die 75% eine 75% Wahrscheinlichkeit,da größer 25 bis gleich 100 ?

Wie kann ich jetzt mit Prozentzahlen wie 5%, 25% und 75% die richtige Wahrscheinlichkeit ermitteln ?

Gibt es eine bessere Möglichkeit als diese ( falls das überhaupt stimmt) ?

int summe = ... // Summe aller Wahrscheinlichkeiten, hier 5 + 25 + 75 = 105
int nummer = Random.Next(0, summe);
int tmp = 0;
for(int index = 0; index < list.Count; ++index){
    if( list[index].Chance + tmp >= nummer){
        return list[index].Objekt; // Wahrscheinlichkeit erfüllt
    }
    tmp += list[index.Chance]; // wie oben, bei 50% + die vorherigen 5%
}
...zur Frage

Java Methode einer anderen klasse bentuzen

Ich hab vollgendens problemm ich versuche die methode wuerfeln() aus der klasse ZweiWuerfel in der klasse Spieler1 zu verwenden und ich bekomme immer den error: "cannot find symbel- method maybe you meant wuefeln()" - Ja ich meine wuerfeln habs aber auch korrekt geschrieben, danke für die hilfe Zwei würfel: public class ZweiWuerfel {

private int wuerfel1;
private int wuerfel2;
public int ergebniss;

public ZweiWuerfel() { ergebniss = 0; wuerfel1 = 0; wuerfel2 = 0;

}
public int wuerfeln() 
{
    wuerfel1 = (int)(6*Math.random())+1;
    wuerfel2 = (int)(6*Math.random())+1;

     if (wuerfel1 >= wuerfel2)ergebniss = wuerfel1 *10 + wuerfel2;
      if (wuerfel1 < wuerfel2) ergebniss = wuerfel2 *10 + wuerfel1;
    return ergebniss;
}

}

Spieler 1: public class Spieler1 { private int ergebnissSp1; private int luegeSp1; private boolean luege; public ZweiWuerfel wuerfeln; public ZweiWuerfel Ergebniss;

public Spieler1() {ergebnissSp1 = 0; luege = false;

}

public void werfen() { wuerfeln(); }

}

...zur Frage

Objektorientiertes Programmieren: Die geringste Geschwindigkeit anzeigen?

In einer Aufgabe sollten wir die Methode ermitteGeschwindigkeit() programmieren, die die geringste Geschwindigkeit von den Kamelen in der Karawane anzeigt. Habe jetzt ein Lösungsvorschlag, der sich von dem Lösungsvorschlag im Erwartungshorizont bisschen unterscheidet und würde gerne wissen, ob man es so machen kann, wie ich es gemacht habe und wenn nicht, wieso. Mein Vorschlag: public int ermittleGeschwindigkeit() { Kamel A = Erstes; for (Kamel K = Erstes; k!= null ; k = k.Nächstes) { if (k.getGeschwindigkeit < A.getGeschwindigkeit) { A = k; }} return A.getGeschwindigkeit; }

Lösungsvorschlag: public int ermittleGeschwindigkeit() {
int Geschwindigkeit = Erstes.Geschwindigkeit;
for (Kamel k = Erstes; k != null; k = k.Nächstes) {
if (k.Geschwindigkeit < Geschwindigkeit ) {
Geschwindigkeit = k.Geschwindigkeit; }
}
return Geschwindigkeit }

Noch eine kurze Frage. Wieso kann man Kamel A = Erstes einfach so deklarieren? Das haben sie so im Material gemacht und habe es einfach mal so übernommen. Aber muss man nichts mit einem getBefehl oder mit Position[0] oder so bestimmen, welches Pferd genommen wird?

...zur Frage

Programmieren (Java) verschiedene Begriffe erklärung?

Was sind:

-Tokens

-Bezeichner

-Ausdrücke

-Ausdrucksanweisungen

Wäre echt nett, wenn mir einer diese 4 begriffe verständlich erklärt LG

...zur Frage

Welche Programmiersprache sollte ich erlernen?

Sehr geehrte Gemeinde,

Also es ist so. Ich interessiere mich für das Erlernen wie man Programme bzw. Anwendungen, Scripts und sonstiges schreibt. Ich plane eine konkrete Ausbildung in einer dieser Sprachen zu machen.

Ich bin sehr interessiert daran und weiß auch das es schwer wird, das ist keine Frage.

Ich hab allerdings jetzt keine richtige Ahnung in welcher Sprache ich mein Wissen aufbauen bzw. einen Lehrgang starten soll.

Ich habe mich schon ein wenig informiert und kenne vom Namen folgende gebräuchlichen Programmiersprachen, mit einer von denen ich mich dann auch weiterbilden möchte:

C, C++, C#, Java, Visual Basic oder Visual Basic for Applications (VBA).

Des Weiteren bin an Python interessiert, weil eines meiner persönlichen Lieblingsprogramme in Python geschrieben ist. Mit Python möchte ich aber keinen Lehrgang belegen.

Es wird sich ausschließlich um eine der oberen Programmiersprachen handeln.

Kann jemand von euch, der sich vielleicht schon mit der ein oder anderen oder sogar mehreren von denen auskennt, mir Tipps geben, welche Programmiersprache, die besten Möglichkeiten (auch in der Zukunft) gibt bzw. was für Einschränkungen bei diesen bestehen?

Ich möchte einmal hochleistungsfähige Programme schreiben.

Auf der Einfachheit liegt überhaupt kein Betrachtungspunkt.

Es kann also schwer sein, wenn es dafür entsprechend flexible Möglichkeiten bietet.

Bei Java habe ich schon gehört, dass man hiermit plattformübergreifende Applikationen schreiben kann.

Vielen Dank für Eure/deine Hilfe.

...zur Frage

Was möchtest Du wissen?