2009-06-05 15 views
5

I zostały poszukiwania i to właśnie wydaje się działać na tych samych artykułów, w tym kodzie:

try 
    { 
     //some code 

    } 
    catch(Exception $e){ 
     throw $e; 
    } 

Skąd $ e pobiera przechowywane lub jak webmaster go zobaczyć? Czy powinienem szukać specjalnej funkcji?

Odpowiedz

7

An Exception object (w tym przypadku $ e) wyrzucony z wnętrza bloku catch {} zostanie przechwycony przez następny najwyższy blok try {} catch {}.

tutaj głupie przykład:

try { 
    try { 
     throw new Exception("This is thrown from the inner exception handler."); 
    }catch(Exception $e) { 
     throw $e; 
    } 
}catch(Exception $e) { 
    die("I'm the outer exception handler (" . $e->getMessage() . ")<br />"); 
} 

Wynikiem powyższego jest

mi zewnętrzna obsługi wyjątków (jest wyrzucane z wewnętrznej obsługi wyjątków).

+0

Thanks Mark, i wybaczyć newbiness ale jak zrobić Sprawdzam getMessage, więc widzę, jakie błędy nadchodzą? – jcslzr

+4

$ e-> getMessage() to po prostu funkcja, która zwraca ciąg znaków z komunikatem o błędzie. Przykład # 1 tutaj (http://www.php.net/manual/en/language.exceptions.extending.php) zawiera dobre informacje na temat metod dostępnych w standardowym obiekcie Exception. –

+1

Dziękuję, sprawdzę to CS – jcslzr

1

$e to instancja o nazwie Exception lub dowolnej innej klasie, która rozszerzyła się z Exception. Obiekty te mają pewne wspólne cechy i metody wspólne (odziedziczone z klasy Exception), których możesz użyć. Aby uzyskać więcej informacji, zobacz numery chapter about exceptions i Exception member list.

1

Zakładam, że używasz jakiegoś kodu/biblioteki stron trzecich z tym kodem, który rzuca wyjątek do twojego kodu. Po prostu musisz być przygotowany na wyrzucenie wyjątku, aby go złapać, możesz go zalogować/wyświetlić, jak chcesz.

try { 
    $Library->procedure(); 
catch(Exception $e) { 
    echo $e->getMessage(); //would echo the exception message. 
} 

Aby uzyskać więcej informacji przeczytaj wpis do instrukcji PHP na Exceptions.

1

Linie:

catch(Exception $e){ 
    throw $e; 
} 

Don \ t sensu. Podczas połowu wyjątek jesteś przypuszczać, aby zrobić coś, z wyjątkiem takich jak:

catch(Exception $e){ 
    error_log($e->getMessage()); 
    die('An error has occurred'); 
} 

Ale w twoim przypadku jest wyjątek bezpośrednio do zewnętrznej try-bloku, które już miały miejsce.
W przypadku zmiany kodu do:

//some code 

stworzyłoby dokładnie takie samo zachowanie.

+0

Tak! Nienawidzę widzieć kodu, w którym wyjątek został złapany i ponownie zgłoszony. Obsługa wyjątków nie wymaga uwagi, co skutkuje przypadkową obsługą błędów w dużym systemie, a nie czystym kodem i łatwą diagnozą problemów. – grantwparks

5

Jedną miłą rzeczą jest to, że wyjątek implementuje __toString() i wysyła ślad stosu wywołań.

Więc czasami Wyjątki niskopoziomowych, że wiem, że będę chciał zobaczyć, jak mam się w catch() po prostu zrobić

error_log($e); 
+0

dziękuję za to, dokumenty nie pokazują przekazanie obiektu wyjątku do error_log(). Myślałem, że szukam sposobu na tę funkcjonalność. złapać, obsłużyć i zalogować za pomocą domyślnego programu obsługi, nie wydawało się trudne, dopóki nie spróbujesz go znaleźć. – ddowns

+0

Bardzo proszę. Zasadniczo natknąłem się na aspekt śledzenia stosu implementacji '__toString()' w Exception i użyłem go do zastąpienia funkcji starszej, której używaliśmy. – grantwparks