2014-10-05 14 views
5

Czy jest jakiś sposób, aby powiedzieć programowi PHP, aby wyrzucił wyjątek, gdy próbuję uzyskać dostęp do elementu lub metody na obiekcie null?Obsługa uchwytów null przez wyjątek

Np .:

$x = null; 
$x->foo = 5; // Null field access 
$x->bar(); // Null method call 

Teraz mogę tylko dostać się następujące błędy, które nie są przyjemne w obsłudze:

PHP Notice: Trying to get property of non-object in ... 
PHP Warning: Creating default object from empty value in ... 
PHP Fatal error: Call to undefined method stdClass::bar() in ... 

chciałbym mieć konkretny wyjątek rzucony jest zamiast. czy to możliwe?

+0

Zarejestruj globalną procedurę obsługi błędów (http://php.net/manual/en/function.set-error-handler.php) i wyślij własne wyjątki. – Rob

Odpowiedz

3

Możesz zamienić swoje ostrzeżenia na wyjątki, używając , więc gdy kiedykolwiek pojawi się ostrzeżenie, wygeneruje wyjątek, który możesz złapać w bloku try-catch.

Błędy krytyczne nie mogą zostać przekształcone w wyjątki, są one zaprojektowane tak, aby zatrzymać php. jednak możemy obsłużyć błąd płodu wdziękiem wykonując jakąś ostatnią przetwarzanie minut korzystając register_shutdown_function()

<?php 

//Gracefully handle fatal errors 
register_shutdown_function(function(){ 
    $error = error_get_last(); 
    if($error !== NULL) { 
     echo 'Fatel Error'; 
    } 
}); 

//Turn errors into exceptions 
set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) { 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
}); 

try{ 
    $x = null; 
    $x->foo = 5; // Null field access 
    $x->bar(); // Null method call 
}catch(Exception $ex){ 
    echo "Caught exception"; 
} 
1

Dodaj ten kod w pliku, który jest dołączony lub zawartej przed czymkolwiek innym:

set_error_handler(
    function($errno, $errstr, $errfile, $errline) { 
     throw new \ErrorException($errstr, $errno, 1, $errfile, $errline); 
    } 
); 
2

Spróbuj tego kodu, aby złapać wszystkie błędy:

<?php  
$_caughtError = false; 

register_shutdown_function(
     // handle fatal errors 
     function() { 
      global $_caughtError; 
      $error = error_get_last(); 
      if(!$_caughtError && $error) { 
       throw new \ErrorException($error['message'], 
              $error['type'], 
              2, 
              $error['file'], 
              $error['line']); 
      } 
     } 
); 

set_error_handler(
    function($errno, $errstr, $errfile, $errline) { 
     global $_caughtError; 
     $_caughtError = true; 
     throw new \ErrorException($errstr, $errno, 1, $errfile, $errline); 
    } 
); 

Powinno zostać wykonane lub włączone przed innym kodem.

Można również zaimplementować Singleton, aby uniknąć zmiennych globalnych lub pozwolić mu rzucić dwa wyjątki, jeśli nie masz nic przeciwko.

Powiązane problemy