2012-09-11 16 views
11
try  
{ 
    $matrix = Query::take("SELECT moo"); //this makes 0 sense 

    while($row = mysqli_fetch_array($matrix, MYSQL_BOTH)) //and thus this line should be an error 
    { 

    } 

    return 'something'; 
} 
catch(Exception $e) 
{ 
    return 'nothing'; 
} 

Jednak zamiast po prostu się złapać część i powrocie nothing pokazuje ostrzeżenie Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, null given w linii startu z while. Nigdy nie doszedłem do używania wyjątków w php, ale użyłem ich dużo w C# i wygląda na to, że w PHP działają inaczej lub, jak zawsze, brakuje mi czegoś oczywistego.PHP try-catch nie działa

+0

Oto kilka pytań: http://stackoverflow.com/questions/1241728/can-i-try-catch-a-warning –

+0

Duplikat: http://stackoverflow.com/questions/1241728/can- i-try-catch-a-warning – wesside

+0

Przeczytaj ten http://phpmaster.com/error-handling-in-php/ – vascowhite

Odpowiedz

18

Nie można obsługiwać ostrzeżeń/błędów za pomocą bloków try-catch, ponieważ nie są one wyjątkami. Jeśli chcesz poradzić sobie z ostrzeżeniami/błędami, musisz zarejestrować własną procedurę obsługi błędów za pomocą set_error_handler.

Lepiej rozwiązać ten problem, ponieważ można temu zapobiec.

+0

opierając się na tej odpowiedzi, możesz łatwo ustawić set_error_handler, aby uchwycić błędy PHP i wydać wyjątek, w którym to momencie twój try-catch zadziała. Jestem pewien, że możesz znaleźć coś dla siebie. –

+0

Aby rzucić wyjątki, set_error_handler powinien być używany w połączeniu z ErrorException (wbudowana klasa specjalnie dla tego zastosowania). –

+0

Od kilku lat robię php w pełnym wymiarze godzin i nawet o tym nie wiedziałem. –

6

W PHP ostrzeżenie nie jest wyjątkiem. Ogólnie najlepszą praktyką byłoby użycie kodowania defensywnego, aby upewnić się, że wynik jest zgodny z oczekiwaniami.

3

Welp, niestety jest to problem dotyczący PHP. Instrukcje wypróbowania/przechwytywania wychwytują wyjątki, ale otrzymujesz oldskulowy błąd PHP.

Musisz złapać błąd jak ten z: http://php.net/manual/en/function.set-error-handler.php

Albo to, albo sprawdzić, czy $ matryca jest obiektem mysqli_result przed wykonaniem mysqli_fetch_array.

+0

Old-school obsługa błędów PHP działała dla mnie. Dziękuję za wskazanie mnie w tym właściwym kierunku! – Clomp

1

PHP generuje ostrzeżenie, a nie wyjątek. Ostrzeżenia nie mogą zostać przechwycone. Są bardziej podobne do ostrzeżeń kompilatora w języku C#.

0

Wyjątkiem jest tylko podklasa Throwable. Złapać błąd można spróbować wykonać jedną z następujących czynności:

try { 

    catch (\Exception $e) { 
     //do something when exception is thrown 
} 
catch (\Error $e) { 
    //do something when error is thrown 
} 

LUB bardziej zintegrowane rozwiązanie

try { 

catch (\Exception $e) { 
    //do something when exception is thrown 
} 
catch (\Throwable $e) { 
    //do something when Throwable is thrown 
} 

BTW: Java ma podobne zachowanie.