2014-10-05 177 views
5

有沒有一種方法可以告訴PHP在我試圖訪問null對象上的成員或方法時拋出異常?PHP處理異常空處理

例如爲:

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

現在,我只得到了下面的錯誤不屬於很好的處理:

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 ... 

我想有而不是拋出一個特定的異常。這可能嗎?

+0

註冊一個[全局錯誤處理程序](http://php.net/manual/en/function.set-error-handler.php)並拋出你自己的異常。 – Rob 2014-10-05 16:16:21

回答

3

您可以使用將警告轉爲異常,因此當發生警告時,它會生成一個異常,您可以在try-catch塊中捕獲該異常。

致命錯誤不能轉化爲例外,他們是專爲PHP停止儘快。但是,我們可以通過做使用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

所包含或其他任何東西之前執行的文件中添加以下代碼一些最後一分鐘的處理妥善處理胎兒的錯誤:

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

試試這個代碼來捕獲全部錯誤:

<?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); 
    } 
); 

它應該被執行或包含在其他代碼之前。

你也可以實現一個Singleton來避免全局變量,或者讓它拋出兩個異常,如果你不介意的話。