2012-02-09 33 views

Trả lời

5

Tại sao không có một trình xử lý lỗi và lọc theo loại lỗi trong trình xử lý và gọi các chức năng khác nhau từ đó? Thực hiện một GenericErrorHandler() và làm điều này trong nó:

switch($errno){ 
    case E_USER_ERROR: UserErrorHandler(...); break; 
} 
1

Bạn có thể có một xử lý lỗi và xử lý các lỗi như thế này (okay, đó là PHP 5.3 nhưng cho tôi xin lỗi - sửa đổi nhẹ và nó sẽ hoạt động bình thường)

set_error_handler(function($errno, $errstr, $errfile, $errline) 
{ 
    switch($errno) 
    { 
     case E_ERROR: 
     { 
      # Bla bla bla, your code here 
      return true; 
     } 
    } 

    return false; 
}); 

Nếu bạn thực sự phải sử dụng hai set_error_handler khác nhau, thì bạn có thể sử dụng lệnh gọi hàm để xử lý lỗi trước đó. Và thậm chí sau đó, bạn sẽ mất những lỗi bạn đang lọc.

Có bộ điều khiển như vậy mặc dù thanh lịch hơn nhiều.

+1

Xin lưu ý rằng điều này giả định> = PHP 5.4 – thorne51

3

Vì vậy, để nắm bắt những gì Westie đang nói, phần quan trọng là bạn chỉ có thể có một trình xử lý lỗi và hàm set_error_handler() trả về trình xử lý lỗi đã xác định trước đó hoặc null nếu không được xác định. Vì vậy, trong trình xử lý lỗi của bạn, có thể sử dụng một lớp lưu trữ trình xử lý lỗi trước đó khi đăng ký nó, để khi bạn xử lý các lỗi với phương thức lớp của mình, hãy gọi trình xử lý lỗi trước đó. Một đoạn trích từ các khách hàng quạ-php Sentry:

public function registerErrorHandler($call_existing_error_handler = true, $error_types = -1) 
{ 
    $this->error_types = $error_types; 
    $this->old_error_handler = set_error_handler(array($this, 'handleError'), error_reporting()); 
    $this->call_existing_error_handler = $call_existing_error_handler; 
} 

và sau đó là phương pháp xử lý lỗi:

public function handleError($code, $message, $file = '', $line = 0, $context=array()) 
{ 
    if ($this->error_types & $code & error_reporting()) { 
     $e = new ErrorException($message, 0, $code, $file, $line); 
     $this->handleException($e, true, $context); 
    } 

    if ($this->call_existing_error_handler && $this->old_error_handler) { 
     call_user_func($this->old_error_handler, $code, $message, $file, $line, $context); 
    } 
} 
Các vấn đề liên quan