2009-07-03 38 views
5

Cảm ơn bạn một và tất cả trước.Xử lý lỗi PHP

Tôi hiện đang trong quá trình tinh chỉnh/cải thiện khung MVC mà tôi đã viết từ đầu cho công ty của mình. Nó là tương đối mới, do đó, nó chắc chắn là không đầy đủ. Tôi cần kết hợp xử lý lỗi vào khung công tác (mọi thứ sẽ có quyền truy cập để xử lý lỗi) và nó sẽ có thể xử lý các loại và mức lỗi khác nhau (Lỗi người dùng và lỗi khung). Câu hỏi của tôi là cách tốt nhất và cơ chế tốt nhất để làm điều này là gì? Tôi biết về xử lý ngoại lệ của PHP 5 và cơ chế lỗi khác nhau của PEAR, nhưng tôi chưa bao giờ sử dụng bất kỳ cơ chế nào trong số đó. Tôi cần một cái gì đó hiệu quả và dễ sử dụng.

Làm cách nào để tạo lỗi xử lý lỗi của riêng tôi hoặc sử dụng thứ gì đó đã được tạo? Bất kỳ lời đề nghị, lời khuyên, câu hỏi chắc chắn được hoan nghênh. Tôi cuối cùng sẽ nghĩ rằng nó ngọt ngào bằng cách nào đó đăng ký xử lý lỗi với PHP để tôi chỉ cần ném lỗi và sau đó quyết định phải làm gì với nó và liệu có tiếp tục không.

EDIT: Rất tiếc, tôi nên cung cấp thêm chi tiết về loại lỗi mà tôi muốn đăng nhập. Tôi đang tìm cách đăng nhập 2 loại lỗi chính: Người dùng và Khung. Đối với lỗi người dùng, tôi có nghĩa là những thứ như url xấu (404), truy cập trái phép vào các trang bị hạn chế, v.v. Tôi biết tôi chỉ có thể định tuyến lại trang chủ hoặc phát ra một hộp thoại JavaScript, nhưng tôi muốn có thể xử lý các lỗi này một cách thanh lịch và thêm nhiều lỗi người dùng khi chúng trở nên hiển nhiên.

By lỗi Khung Tôi có nghĩa là những thứ như không thể kết nối với cơ sở dữ liệu, ai đó đã xóa một bảng cơ sở dữ liệu về tai nạn hoặc xóa một tập tin nào đó, vv

Ngoài ra, tôi sẽ chăm sóc phát triển và xử lý máy chủ trực tiếp.

+0

không phải là câu trả lời, nhưng đừng quên xử lý môi trường sản xuất/dev :) – marcgg

Trả lời

5

tôi cuối cùng sẽ nghĩ nó vị ngọt nào đó đăng ký xử lý lỗi với PHP vì vậy mà tôi chỉ sẽ cần phải ném lỗi và sau đó quyết định những gì làm gì với nó và xem có nên tiếp tục.

Bạn có thể thực hiện chính xác điều đó, với set_error_handler()set_exception_handler().

Không có "một cách đúng" để xử lý lỗi, nhưng dưới đây là một số điều cần xem xét.

  • trigger_error() tương tự như ném mới Ngoại lệ ở chỗ cả hai đều thoát ra khỏi thực thi hiện tại ngay lập tức, chỉ trigger_error() không thể bắt được.
  • Bạn muốn các lỗi được xử lý trên môi trường dev (hiển thị trên màn hình như thế nào?) So với trong môi trường sản xuất (đã đăng nhập và gửi email?)
  • Bạn có thể sử dụng các chức năng trên để "chuyển đổi" các lỗi ngoại lệ hoặc ngược lại lại
  • Không phải tất cả các loại lỗi có thể được xử lý với một lỗi xử lý tùy chỉnh
+0

Cảm ơn bạn, tôi không biết về các chức năng đó. Đối với lỗi trên máy chủ dev, tôi sẽ chỉ phát ra trên màn hình (hoặc bảng điều khiển firebug) và đăng nhập/email trên máy chủ trực tiếp tùy thuộc vào loại lỗi và cấp độ. –

+0

Tôi có thể sẽ kết hợp điều này với một số lớp ngoại lệ tùy chỉnh. –

5

Dưới đây là một số điều mà tôi thường làm:

  • Sử dụng một thiết lập cấu hình toàn cầu hoặc cờ để chuyển qua lại giữa develo pment và sản xuất.
  • Không sử dụng lỗi php khi bạn có lựa chọn: Ưu tiên ngoại lệ cho việc xử lý lỗi của riêng bạn.Nếu bạn đang sử dụng thư viện không sử dụng ngoại lệ, hãy phát hiện lỗi và ném ngoại lệ của riêng bạn.
  • Sử dụng trình bắt ngoại lệ cấp cao nhất hiển thị ngoại lệ theo cách dễ đọc. Nếu bạn đặt chiến lược try-catch-block này, bạn không cần phải đăng ký một trình xử lý ngoại lệ toàn cục.
  • Luôn phát triển với error_handeling(E_ALL | E_STRICT)
  • Bắt cảnh báo và thông báo PHP bằng cách sử dụng set_error_handler() và ngừng thực thi. Điều này loại bỏ rất nhiều lỗi trước, với kết quả rất chắc chắn.
  • Mã thông báo lỗi toàn cầu phải rất nhẹ, để tránh lỗi. Luôn luôn có nguy cơ đệ quy khi xử lý các trình xử lý lỗi toàn cầu.
  • Nếu hệ thống đang ở chế độ sản xuất, không hiển thị bất kỳ chi tiết nào: Đăng nhập lỗi và tạo số nhận dạng duy nhất mà người dùng có thể tham khảo nếu họ muốn gửi lỗi hoặc báo cáo lỗi.
+1

Cảm ơn lời khuyên. Tôi chưa bao giờ nghĩ đến việc sử dụng set_error_handler() như thế trong quá trình phát triển, có ý nghĩa tốt. –

2

Khi làm việc trên một trang web lớn hơn, tốt hơn là nên hiểu lịch sử lỗi, đặc biệt khi mọi thứ có thể dễ dàng xếp vào đường logic không mong muốn khi người kiểm tra hoặc người dùng kích hoạt một trường hợp sử dụng lạ.

Tôi có xu hướng xây dựng các khối thử có khả năng ghi nhật ký lỗi và tạm dừng thực thi trong trường hợp có gì đó gây tử vong (và phát ra trang lỗi về phía trước với mã lỗi) hoặc trong trường hợp lỗi mềm, tiếp tục, nhưng lưu ý nó trong nhật ký lỗi của tôi. Chủ yếu là xây dựng một trình xử lý lỗi tùy chỉnh, vì tôi thấy có quá nhiều sắc thái khác, khi bạn mở rộng quy mô.

Trong quá trình phát triển, tôi sử dụng trình lược tả PHP của Particletree để ghi lỗi và các dữ liệu liên quan khác vào bảng điều khiển có dấu vết, thông báo và dòng. Nó chỉ là khá - không thể nói đến hiệu quả của nó. Nó có thể sưng lên mã, nhưng ôi chúa ơi của tôi, nó có thể là một người tiết kiệm cuộc sống để có một sự hiểu biết văn bản đơn giản về nơi và làm thế nào lỗi xảy ra. Đặc biệt hữu ích khi đối phó với những thứ như dịch vụ web SOAP sẽ ném ngoại lệ vào bạn như businsess của ai đó.

Tôi cũng thấy hữu ích khi trừu tượng Nhật ký gỡ lỗi và giữ cho nó toàn cầu, chẳng hạn như mọi người đã nói trước đây, khi bạn chuyển sang sản xuất, bạn không nhổ tất cả các loại đồ giặt bẩn vào không khí internet lạnh , vì bạn có thể dễ dàng thay đổi đầu ra của trình gỡ rối thành cơ sở dữ liệu sql, hoặc email, hoặc bất cứ thứ gì.

Particletree của Profiler: http://particletree.com/features/php-quick-profiler/

+0

Tôi đã sử dụng lớp Đăng nhập của PEAR trước đây và một điều tôi thích về nó là nó có thể xử lý nhiều cơ chế ghi nhật ký khác nhau (email, db, tệp, bảng điều khiển, v.v.). Tôi đang nghĩ đến việc sử dụng điều đó cho việc ghi nhật ký lỗi vào đúng vị trí. –

0

Trước khi đi sống tôi thử nghiệm dự án của tôi hoàn toàn ở những giai đoạn quan trọng trong quá trình phát triển, kiểm tra các bản ghi lỗi của tôi (tôi sử dụng bảng điều khiển Plesk) để theo dõi lỗi php.

Khi dự án đang hoạt động, ở các giai đoạn chính trong một lớp học hoặc ứng dụng, tôi gửi một lỗi hoặc gỡ lỗi báo cáo bằng cách sử dụng lớp tôi đã tạo. Nó gửi báo cáo lỗi đến một địa chỉ email được xác định với thông tin quan trọng như: datetime, ip người dùng, trang giới thiệu, url đầy đủ và ghi chú ngắn mà tôi xác định khi kích hoạt/gọi lớp gỡ lỗi.

Tôi sử dụng để buộc nó viết một tệp nhật ký, nhưng thấy điều này không an toàn, vì thư mục phải có một chmod 777 và không hiệu quả vì tôi phải truy cập nhật ký mới nhất mỗi lần. Bằng cách gửi email cho họ, tôi hành động ngay lập tức.

+0

Cảm ơn, tôi muốn xây dựng nó để nó có thể đăng nhập trên cơ sở loại lỗi/mức độ lỗi. Một số lỗi chỉ được ghi lại, những người khác đăng nhập và người dùng được hiển thị một trang lỗi, và những người khác thì người dùng nhận được một trang lỗi và lỗi được ghi lại và một email được gửi đi. –