Der-Dennis: Return in try-catch-Block

Beitrag lesen

Hey dedlfix,

Naja, man könnte das mit dem if wie bei self::getDefaultLocale() lösen,
wie würdest Du das machen? In dem Fall kann ich doch nicht auf null prüfen, oder?

Einfach nur try-catch und fertig, also so wie in meinem Code. Wenn du trotzdem if nehmen willst, musst du schauen, was für potentielle Ergebnisse du bekommen kannst, dann weißt du, auf was du prüfen kannst.

Dann habe ich das doch richtig verstanden. Dachte nur zwischenzeitlich, Du könntest so etwas wie (Pseudo-Code)

  
if (($locale = self::getDefaultLocale()) !== Exception) {}  

meinen. Und das wäre etwas mir Unbekanntes gewesen.

aber dann hat man immer noch nicht eventuelle Exceptions der Registry aus anderen Gründen als Nichtvorhandensein gefangen.
Da wäre die Frage: Will man das denn?

Kommt drauf an. Dazu müsste man sich die Registry ansehen, um herauszufinden, welche Exceptions sie werfen kann und wie sinnvoll ein Abfangen und Ignorieren (wie in diesem Fall) ist.

Zum besseren Verständnis in diesem Fall, hier die statische get-Methode von Zend_Registry:

  
    public static function get($index)  
    {  
        $instance = self::getInstance();  
  
        if (!$instance->offsetExists($index)) {  
            require_once 'Zend/Exception.php';  
            throw new Zend_Exception("No entry is registered for key '$index'");  
        }  
  
        return $instance->offsetGet($index);  
    }  

Ich möchte doch eigentlich nur auf Vorhandensein eines Schlüssels prüfen. Wenn die Registry aus welchem Grund auch immer eine andere Exception wirft, kann ich die in einer Funktion wie der oben genannten doch nicht sinnvoll verarbeiten. Würde ich auch die anderen Ausnahmen fangen (was hier ja passiert), hätte doch beispielsweise der Front-Controller keine Möglichkeit etwas zu "korrigieren".

Für diesen speziellen Fall kann man sich die Auswirkungen anschauen, wenn man den Registry-Code kennt. Dan kann man entscheiden, ob das try-catch da sinnvoll ist oder nicht. Es kann gut sein, dass es ebenfalls ein Überbleibsel aus einer Zeit ist, als die Registry Exceptions warf, wenn sie das jetzt nicht mehr machen sollte. (Ich weiß das nicht, weil ich es mir nicht angesehen habe.) Dann könnte man das streichen und mit einem if arbeiten.

Wie oben in der Methode gezeigt wirft die Registry noch immer Exceptions. Allerdings in diesem Fall, wenn ein Schlüssel nicht existiert.
Was würdest Du in diesem Fall empfehlen? Try...catch oder if...else?

Der FrontController kann aber auch mit einem null-Ergebnis "korrigieren". Vermutlich bringt es ihm keine Zusatzpunkte, wenn er die genaue Ursache des Locale-Holen-Misslingens kennt.

Da bin ich mir nicht so sicher. Wie gesagt, vielleicht hab ich das Prinzip noch nicht richtig verstanden. Aber wenn ich einen null-Wert bekomme, gebe ich die Verantwortung - im Gegensatz zu einer Exception - nicht zum Front-Crontroller zurück. Daher kann der dann auch nichts machen.
Zu dem Punkt, dass es ihm "keine Zusatzpunkte" bringt (übrigens sehr schön!) kann ich Dir aber nur zustimmen.

Wäre nicht beispielsweise folgendes Konstrukt ohne try...catch denkbar (und wie sinnvoll wäre es?):
return (array_key_exists('Zend_Locale', Zend_Registry::getInstance())) ? Zend_Registry::get('Zend_Locale') : null;

Ja, wenn einerseits es keine Exceptions beim Abarbeiten des Codes geben kann oder aber du Exceptions unbehandelt weiterreichen willst.

Das war immer mein Gedanke, dass ich eine Exception so weit durchreichen lasse, bis sich eine Instanz meldet, die mit diesem Fehler umgehen kann. Im "schlimmsten" Fall wäre das also ein Exception-Handler, der eine Fehlerseite ausgibt.

Danke und Gruß, Dennis