phpbar.de logo

Mailinglisten-Archive

[php] HOWTO: Catch von Exceptions die man nicht selber geworfen hat

[php] HOWTO: Catch von Exceptions die man nicht selber geworfen hat

Yannik Hampe yannik at cipher-code.de
Fre Feb 29 12:49:10 CET 2008



..... Ollio ...... wrote:
> Ich habe mir zwei Funktionen geschrieben:
> 
> A. array2m_get --------------- Hier soll ein Wert aus einem
> mehrdimensionalen assoziativen Array herauslesen oder NULL zurück
> gegeben werden, falls die HASH-Schlüsselkombination nicht vorhanden
> ist. Das ist zuerstmal eine Fehlerbedingung, diesen Fehler möchte
> aber mit CATCH abfangen um eben den definierten NULL-Wert
> zurückzugeben:
> 
> 
> function array2m_get ($arr, $merkmal1, $merkmal2) { $merkmal1 =
> strtoupper($merkmal1); $merkmal2 = strtoupper($merkmal2); try { $e =
> $arr[$merkmal1][$merkmal2] ; return $e } catch(Exception $e) { return
> NULL; } B. array2m_collect Hier sollen Werte auf einem
> mehrdimensionalen assoziativen Array aggregiert werden. D.h. wenn die
> Schlüsselkombination nicht vorhanden wird, wird ein Eintrag mit
> diesem Schlüssel angelegt und mit dem Wert initalisiert. Wenn schon
> vorhanden, wird der Wert zum bereits bestehenden hinzuaddiert:
> 
> function array2m_collect ($arr, $merkmal1, $merkmal2,$wert) { 
> $merkmal1 = strtoupper($merkmal1); $merkmal2 = strtoupper($merkmal2);
>  try { $arr[$merkmal1][$merkmal2] += $wert; } catch(Exception $e) { 
> $arr[$merkmal1][$merkmal2] = $wert; }  }  // array2m_collect
> 
> Problem --------- So wie es auf den ersten Blick aussieht, kann nun
> aber CATCH dummerweise Exceptions auffangen die im gleichen
> Funktionsblock geworfen werden. Gibt es eine Möglichkeit generell auf
> lokaler Ebene d.h. im akutuellen Block eine an beliebigem Ort
> geworfene Exception abzufangen und zu bearbeiten. Nicht handelbare
> Exceptions müsste dann einfach auf die nächst äussere Ebene
> weitergereicht werden.
> 
> Ich kenne sowas z.B in der Microsoft-Programmierung z.B in VB. Dort
> werden Systemereignisse wie Exceptions allen interessierten. d.h.
> registrierten Fehlerbehandlungsroutinen angeboten. Dabei beginnt die
> Durchreichung eines Fehler vom lokalen, Detailcode. Alle nicht
> behandelten Fehler werden dann entlang der Hierarchie hochgereicht.
> Mit anderen Worten die Fehler eskalieren entlang der
> Systemhierarchie.
> 
> Ist so etwas in PHP (noch) nicht möglich? Was müsste ich tun, um das
> so zum laufen zu kriegen. Danke für euere Hinweise, Ollio

In php "blubbert" eine Exception nach oben, bis sie abgefangen wird. Du
kannst eine Exception an jeder beliebigen Position abfangen. Um eine
Exception abzufangen muss allerdings erstmal eine Exception geworfen
werden (irgendwie logisch).
So wie ich das sehe gehst du davon aus, dass php hierbei:
$arr[$merkmal1][$merkmal2] +=$wert;
eine Exception wirft, wenn der Wert nicht existiert. Dem ist nicht so.
Php wirft lediglich eine Notice (die du nicht wie eine Exception
abfangen kannst) und legt der fehlenden Wert einfach an. Wenn du das
nicht möchtest, musst du vorher prüfen ob der wert existiert:
if (!isset($arr[$merkmal1][$merkmal2])) return null;
(ich fände es allerdings auch logisch false zurückzugeben statt null.

Yannik

php::bar PHP Wiki   -   Listenarchive