2011-06-23 8 views
10

Jestem zagnieżdżony próbuję catch wewnątrz głównej instrukcji catch catch, co chciałbym wiedzieć, to jak mogę sprawić, by główna próba catch się nie udała, jedna z zagnieżdżonych próśb nie powiedzie się?Jak przekazać wyjątek złowiony w wewnętrznym haczyku do zewnętrznego catch w zagnieżdżonej próbie catch

Oto mój kod:

try 
{  
    try 
    { 
     //how can I make the main try catch fail if this try catch fails? 
    } 
    catch(Exception $e) 
    { 
     error_log(); 
    }  
} 
catch(Exception $e) 
{ 
    error_log(); 
} 

Odpowiedz

18

Po error_log(); w pierwszym try-catch, typ throw $e; (w nowej linii). Spowoduje to ponowne zgłoszenie błędu, a zewnętrzny try-catch go obsłuży.

2

Wewnątrz wewnętrznego catch, throw() - NIE zalecane, widziałem kilka problemów z PHP podczas tego. Lub ustaw flagę do rzucania zaraz po wewnętrznym haczyku.

Oto przykład rzucania tego samego wyjątku (lub wyrzucenia innego).

try { 
    $ex = null; 
    try { 
     //how can I make the main try catch fail if this try catch fails? 
    } catch(Exception $e){ 
     $ex = $e; 
     error_log(); 
    } 

    if ($ex) { 
     throw $ex; 
    } 

} catch(Exception $e){ 
    error_log(); 
} 
0

użycie zmiennej bool i „powrót” słowo kluczowe w odpowiednim miejscu może zrobić lewę dla Ciebie ...

+1

Celem jest przeniesienie kontroli do zewnętrznego 'catch' po uruchomieniu wewnętrznego. "Zwrot" pomija go całkowicie. – cHao

5

Należy rozszerzyć wyjątek dla różnych różnych typów wyjątku. W ten sposób można wywołać konkretny blok try-catch:

try 
{ 
    ... 
    try 
    { 
    throwSomeException(); 
    } 
    catch (InnerException $e) 
    { 
    ...do stuff only for InnerException... 
    } 
    ... 
} 
catch (Exception $e) 
{ 
    ...do stuff for all types of exception... 
} 

Dodatkowo można łańcucha swoje wypowiedzi catch wywołać różne bloki w jednym try-catch:

try 
{ 
    ... 
} 
catch (SpecificTypeOfException $e) 
{ 
    ..do something specific 
} 
catch (TypeOfException $e) 
{ 
    ..do something less specific 
} 
catch (Exception $e) 
{ 
    ..do something for all exceptions 
} 
0

obsłużyć wyjątki w krótkim sposób podobny do eventHandling w JavaScript. Zdarzenie pęcznieje w górę od konkretnej do ogólnej. Po dojściu do programu startowego wyjątek utracił znaczenie kodu i powinien po prostu zostać przechwycony w celu zalogowania i zakończenia aplikacji.

W międzyczasie wiele rzeczy może się zdarzyć

callstack:

  • start Lunch
  • Eat Apple (Przed tym kodem, jabłko został kupiony jako lunch)
  • Sink zęby jabłko

Podczas jedzenia jabłka pojawił się robak:

throw NausiaException('I found a bleeding worm...'); 

Eat zakres Jabłko łapie

catch(Exception $e) 

wyjątkiem, ponieważ w tym zakresie możemy wrócić jabłko do sklepu i krzyczeć na menedżera. Ponieważ nic bardziej użytecznego nie można powiedzieć o wystąpieniu, wywoływane jest wywołanie, ponieważ nie udało się zjeść jabłka.

Coś mogłoby odeszłaś inny Jednakże, jeśli kierownik sklepu odmówił zwrotu, można owinąć wyjątek

throw new RefundFailedException('The manager is a cheap skate', RefundFailedException::REFUSED, $e) 

start obiad Zakres start zakres obiad chce wyrzucić złe obiad

try { 
    //Start lunch 
} catch (Exception $e) { 
    switch (true) { 
     case $e instanceof NausiaException: 
     case $e instanceof RefundFailedException: 
      //Throw lunch away 
      break; 
    } 
} 
Powiązane problemy