Der-Dennis: Return in try-catch-Block

Beitrag lesen

Hey dedlfix,

public function getLocale()

{
        if ($this->_locale !== null) {
            return $this->_locale;
        } else if (($locale = self::getDefaultLocale()) !== null) {
            return $locale;
        } else {
            try {
                $locale = Zend_Registry::get('Zend_Locale');
            } catch (Zend_Exception $e) {
                $locale = null;
            }

if ($locale !== null) {
                return $locale;
            }
        }

return null;
    }


> > >   
> > > Hierbei wird ein try-catch-Block wie im vorherigen Beispiel verwendet (mal ganz abgesehen davon, dass die if-Abfrage innerhalb des else-Zweigs für mich sinnlos ist. Genauso gut könnte ich die weglassen und am Ende $locale zurückgeben).  
>   
> Also, ich sehe da auch keinen Sinn dahinter.  
  
Wenn Du das sagst, bin ich beruhigt :-) (wo ich mir das grad in der Vorschau nochmal durchlese, kann man das auch anders verstehen. Ist aber tatsächlich so gemeint!)  
  

> Möglicherweise hat da einer, nach seinen Versuchen den Code für die Aufgabe zu erstellen, vergessen aufzuräumen.  
  
Das wäre auf jeden Fall "wünschenswert", also dass dies einer schlicht und einfach vergessen hat. Auf jeden Fall besser, als wenn es absichtlich so geschrieben wurde (ich werde das Gefühl nicht los, dass das insbesondere im Zend Framework hin und wieder der Fall ist, was ich in einem anderen Thread ja bereits erwähnt hatte).  
  

> Das ist eine der Stellen, die nach einer Revision dazu führt, dass man in der Nachfolgeversion stolz einen Geschwindigkeitszuwachs berichten kann.  
  
Sollte man deshalb vielleicht doch manchmal Absicht unterstellen... ;-)  
  

> Jedenfalls kann man den Code kürzen zu  
>   
>   public function getLocale()  
>   {  
>     if ($this->\_locale !== null) {  
>       return $this->\_locale;  
>     }  
>     if (($locale = self::getDefaultLocale()) !== null) {  
>       return $locale;  
>     }  
>     try {  
>       return Zend\_Registry::get('Zend\_Locale');  
>     } catch (Zend\_Exception $e) {  
>       return null;  
>     }  
>   }  
>   
> Der Original-Code zeigt übrigens auch mal wieder sinnlose else-Zweige. Wenn der if-Zweig garantiert mit return beendet wird, kann der alternative Code gar nicht mehr ausgeführt werden und muss deshalb nicht in einem else-Block versteckt werden.  
  
So weit hatte ich bei dieser Funktion gar nicht gedacht. Guter Vorschlag!  
  

> > Wobei sich natürlich die Frage stellt, ob in diesem Fall die Verwendung von try...catch überhaupt Sinn macht. Zend\_Registry erweitert ja ArrayObject, sodass ich mit einer einfachen if-Abfrage prüfen kann, ob ein Schlüssel im Array (Zend\_Registry) existiert. Denn meines Wissens ist ein try...catch die schlechtere Alternative zu einer if-Abfrage.  
  
Bei dem folgenden Absatz bin ich mir nicht ganz sicher, wie Du das meinst:  
  

> 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?  
  

> 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? 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".  
Oder fehlt mir da wieder etwas Verständnis der Materie?  
  

> Das try-catch muss also bleiben und macht das if überflüssig.  
  
Wäre nicht beispielsweise folgendes Konstrukt ohne try...catch denkbar (und wie sinnvoll wäre es?):  
  
~~~php
  
return (array_key_exists('Zend_Locale', Zend_Registry::getInstance())) ? Zend_Registry::get('Zend_Locale') : null;  

Gruß, Dennis