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