2011-12-15 5 views
8

Tôi có một trình xử lý lỗi tùy chỉnh đơn giản viết trong tệp nhật ký lỗi một số thông tin gỡ lỗi hữu ích.set_error_handler() doens't làm việc cho lỗi FATAL

nó hoạt động với mọi thứ nhưng nó không được kích hoạt cho lỗi FATAL.

Bất kỳ cách nào để giải quyết vấn đề này?

Hiện nay để vượt qua hoàn cảnh này tôi đã đăng ký một hàm shutdown quá để kiểm tra error_get_last()

+4

['Không thể xử lý các loại lỗi sau với hàm do người dùng xác định: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING và hầu hết E_STRICT được nêu trong tệp nơi set_error_handler() được gọi.'] (http: //us.php.net/set_error_handler) – animuson

+1

Câu hỏi này bỏ liên kết tới: [PHP: Trình xử lý lỗi tùy chỉnh - xử lý lỗi phân tích & lỗi nghiêm trọng] (http://stackoverflow.com/q/1900208/367456). – hakre

Trả lời

16

Không, đó chỉ là một hạn chế của set_error_handler(); nó không xử lý tất cả các lỗi.

Các loại lỗi sau đây không thể được xử lý với một người sử dụng chức năng định nghĩa: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, và hầu hết các E_STRICT lớn lên ở tập tin mà set_error_handler() được gọi.

register_shutdown_function()error_get_last() là giải pháp thay thế khá.

+0

Chúng tôi không thể lấy backtrace theo cách này ... – Loenix

+0

Bạn có thể đưa ra ví dụ về việc sử dụng register_shutdown_function() và error_get_last() như workaround tôi không thể nghĩ ra một. –

4

Chỉ có cách hackish để giải quyết nó, ví dụ: bằng cách sử dụng register_shutdown_function() và sau đó kiểm tra xem có lỗi xảy ra bên trong chức năng đó hay không.

PHP có log_errors vì một lý do, bạn có thể tạo nhật ký PHP mọi lỗi thành nhật ký hệ thống hoặc tệp nhật ký mà không cần một dòng mã tùy chỉnh. Vì vậy, việc sử dụng set_error_handler() cho mục đích này là không cần thiết chút nào và cần tránh trừ khi bạn cần, ví dụ: một stacktrace.

+0

tất nhiên tôi cần stacktrace và/hoặc thông tin gỡ lỗi khác như descrived trong bài viết đầu tiên của tôi – dynamic

+0

Ví dụ về hack workaround xin vui lòng –