2014-10-05 24 views
5

Có cách nào tôi có thể yêu cầu PHP ném một ngoại lệ khi tôi đang cố truy cập một thành viên hoặc phương thức trên đối tượng null không?PHP xử lý xử lý null theo ngoại lệ

ví dụ .:

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

Ngay bây giờ, tôi chỉ nhận được các lỗi sau đây mà không phải là tốt đẹp để xử lý:

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

Tôi muốn có một ngoại lệ cụ thể đang được ném để thay thế. Điều này có thể không?

+0

Đăng ký [trình xử lý lỗi toàn cầu] (http://php.net/manual/en/function.set-error-handler.php) và ném ngoại lệ của riêng bạn. – Rob

Trả lời

3

Bạn có thể bật cảnh báo của bạn vào trường hợp ngoại lệ sử dụng nên khi từng cảnh báo xảy ra, nó sẽ tạo ra một ngoại lệ mà bạn có thể bắt trong một khối try-catch.

Lỗi nghiêm trọng không thể chuyển thành Ngoại lệ, chúng được thiết kế cho php để dừng càng sớm càng tốt. Tuy nhiên chúng ta có thể xử lý các lỗi của thai nhi một cách duyên dáng bằng cách thực hiện một số chế biến phút cuối cùng sử dụng 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

Thêm mã này trong file được bao gồm hoặc thực hiện trước khi bất cứ điều gì khác:

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

Hãy thử mã này để bắt tất cả các lỗi:

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

Cần được thực thi hoặc bao gồm trước mã khác.

Bạn cũng có thể triển khai Singleton để tránh các biến toàn cục hoặc để cho nó ném hai ngoại lệ, nếu bạn không phiền.