2008-10-13 4 views
6

Sollte ich diese Methode zu werfen Fehler werden:Der richtige Einsatz von versuchen .. fangen

if (isset($this->dbfields[$var])) { 
    return $this->dbfields[$var]; 
} else { 
    throw new FieldNotFoundException($var); 
} 

oder diesen Stil:

try { 
    return $this->dbfields[$var]; 
} catch (Exception $e) { 
    throw new FieldNotFoundException($var); 
} 

... oder etwas ganz anderes?

schnelle Erläuterung des Codes:$this->dbfields ist ein Array. isset() prüft, ob eine Variable gesetzt ist, in diesem Fall, ob das Array-Element existiert.

+0

mit der Nummer 2, die Sie eigentlich nicht haben Um eine Ausnahme auszugeben, drucken Sie einfach den aus, den Sie fangen. – Rayne

+0

Nun der Standard "Array-Schlüssel existiert nicht" Fehler (was nicht einmal eine Ausnahme ist, jetzt, wo ich darüber nachdenke), würde keinen Sinn in der Art, wie ich das benutze. – nickf

Antwort

10

Das zweite Beispiel ist schlecht. Sie benötigen eine Menge Aufwand, um eine Ausnahme zu finden, wenn Sie, wie Sie demonstrieren, die Ausnahmebedingung von vornherein genauso einfach verhindern können. Außerdem wird davon ausgegangen, dass Sie wissen, warum diese Ausnahme ausgelöst wurde. Wenn es eine andere Ausnahme gab, z. B. nicht genügend Arbeitsspeicher oder etwas, melden Sie dies als "Feld nicht gefunden", auch wenn dies nicht der Fall war.

Denken Sie daran, dass try/catch in Sprachen wie C++ und Java sehr teuer sind, da sie alle speichern und wiederherstellen müssen. Python andererseits hat sehr billige Ausnahmen und sie ermutigen Sie dazu, eine try/except für einfache Validierung zu verwenden. Aber trotzdem ist es immer noch schlecht, alles einzufangen und so zu tun, als wäre es eine Ausnahme.

+0

Du schlägst mich um 2 Sekunden! – Mark

+0

@Mark - deshalb habe ich über 3500 XP; Ich bin schnell auf die offensichtlichen Antworten! :-) –

3

Fangen „Exception“ nicht der Fall, als die meiste Zeit, eine gute Praxis, aus der zwei, die angezeigt werden, würde ich Option 1.

verwenden, um alle Ausnahmen fangen kann eine andere Ausnahme verstecken und maskieren sie als eine FileNotFoundException.

+0

Sie sollten ernsthaft den ersten Satz umformulieren. Ich glaube nicht, dass das Einfangen einer Ausnahme NIE eine gute Praxis ist. Sehr selten vielleicht, aber aber nicht nie. –

+0

Einverstanden! Danke, Jason, ich war etwas hastig – Mark

4
//First let's do the checks. 
if(!isset($this->dbfields[$var])) 
    throw new FieldNotFoundException($var); 
//Now we're in the clear! 
return $this->dbfields[$var]; 
+0

ist das nicht ziemlich genau das, was mein erstes Beispiel war? – nickf

+0

Es ist klarer, IMO. – Domenic

+0

Es wäre noch klarer ohne Kommentare :) –

2

Ich ziehe die ersten, aber wenn dbfields [var $] etwas Vernünftiges wirft, wenn Sie ein nicht vorhandenes Element zugreifen, dann würde ich es vorziehen, zurückkehr es einfach, ohne zu überprüfen.

Ich mag es nicht besonders, den Ausnahmetyp zu ändern, es sei denn, ich habe einen guten Grund - auch wenn Sie dies tun, sollten Sie versuchen, die ursprüngliche Ausnahme und Stack-Trace beizubehalten.

0

Lesen Sie Ihre Erklärung erneut.

Ich denke, Ihre Methode dort in # 1 wird alle Ausnahmen fangen, die geworfen werden können und einfach einen Bool zurückgeben. Ich mag es definitiv nicht, die generische Ausnahme die meiste Zeit zu fangen, also wäre # 2 nicht meine Wahl.

0

"... oder etwas ganz anderes?"

Weder ist sehr gut, so etwas anderes wäre angemessen.

Fix Version 2, um die richtige Ausnahme zu finden, nicht jede mögliche Ausnahme. Poste das als Option 3. Ich werde etwas upzotten, das eine bestimmte Ausnahme statt Exception fängt.

0

Dies ist alles andere als sprachunabhängig.

Einige Sprachen werden keine Fehler für den Zugriff auf nicht-existente Felder werfen, und das bevorzugte Muster hängt viel von den Implementierungen der Arrays, Tabellen, Objekte usw.