2010-05-07 23 views
7

Tôi đang làm việc trên một khuôn khổ PHP và hiện đang thiết kế xử lý lỗi. Dựa trên những gì tôi đã đọc trên SO, tôi chỉ nên sử dụng ngoại lệ cho, tốt, các tình huống đặc biệt. Vì vậy, ném một ngoại lệ khi nhập sai mật khẩu sai.Có xấu khi ném ngoại lệ để trả về lỗi máy chủ, ví dụ: Lôi 404 Không Tim Được Trang?

Tôi có nên tránh sử dụng ngoại lệ khi tôi muốn trả lại mã lỗi máy chủ cho người dùng (ví dụ: Không tìm thấy trang 404) không? Nếu vậy, tôi có nên viết lớp xử lý lỗi của riêng mình không?

+0

Tôi có câu hỏi tiếp theo cho bất kỳ ai trả lời câu hỏi này - Giả sử người dùng truy cập trang có 3 bản ghi trên đó. Họ nhấp vào liên kết để chỉnh sửa một bản ghi cụ thể nhưng giữa thời gian trang danh sách được hiển thị và thời gian họ nhấp vào bản ghi, bản ghi cụ thể đó đã bị xóa khỏi cơ sở dữ liệu. Trang chỉnh sửa có nên ném ngoại lệ khi chức năng truy xuất cơ sở dữ liệu trả về NULL không?Rõ ràng mã hiển thị khung nhìn sẽ xử lý các ngoại lệ như vậy và hiển thị một thông báo lỗi thích hợp, nhưng tôi tò mò về tình huống như thế nào sẽ được xử lý nội bộ. –

+0

@RenderIn Nếu bộ điều khiển/chế độ xem có thể đặt phản hồi thành 404 và hiển thị trang "thiếu" thích hợp - tôi muốn nói đó là nơi tốt nhất để xử lý nó (xem câu trả lời của tôi). Điều đó nói rằng, khi bạn đang tạo mẫu một cái gì đó, nó dễ dàng hơn rất nhiều để chỉ cần ném ngoại lệ khi biết bộ điều khiển lỗi sẽ ít nhất là cảnh báo người dùng rằng yêu cầu không thành công. –

Trả lời

7

Mã của bạn không nên ném ngoại lệ để tương tác với người dùng, nó sẽ ném ngoại lệ để thông báo mức độ mã cao hơn mà một cái gì đó không thể khôi phục đã xảy ra.

Bây giờ, tùy thuộc vào những gì đã xảy ra, bạn có thể muốn trả lời bằng mã trạng thái HTTP nhất định. Nhưng tại thời điểm đó, bạn không ném ngoại lệ để kích hoạt lỗi máy chủ, bạn đang bắt các trường hợp ngoại lệ và cung cấp cho người dùng phản hồi thích hợp.

Nếu câu hỏi là những gì sẽ xảy ra khi một bài viết/blog/mục/etc được yêu cầu không tồn tại - tốt, nếu có thể cho mã chịu trách nhiệm hiển thị thông tin để chỉ đặt mã phản hồi, thì bằng mọi cách, đừng dùng ngoại lệ.

Nếu bạn đang sử dụng khung MVC và các trình điều khiển riêng lẻ của bạn có thể đặt mã phản hồi, sau đó cho phép chúng.

Và nếu trình xử lý ngoại lệ trên cùng có thể sử dụng mã phản hồi http để trình bày thông báo lỗi tốt hơn cho người dùng, thì hãy để nó.

+0

Đã thêm một chút ví dụ. Tôi phải nói, ngay bây giờ tôi đang có một thời gian khó nghĩ về một tình huống mà một mã phản ứng sẽ hữu ích ở trình xử lý ngoại lệ cấp cao nhất của một khung công tác MVC - giả sử bạn có thể thiết lập mã phản hồi trong các bộ điều khiển. –

0

Ngoại lệ phải được giới hạn CHỈ trong những lần mà ứng dụng thực sự không thể xử lý tình huống.

Như bạn đã nói, việc ném ngoại lệ cho mật khẩu không đúng là rất sai.

Các tình huống loại lỗi máy chủ duy nhất mà tôi có thể đưa ra là nếu tài nguyên được yêu cầu (như máy chủ sql của bạn) không khả dụng.

Ngoài ra, quyền truy cập bị từ chối, v.v ... là tất cả các trường hợp phổ biến mà ứng dụng của bạn phải có cách xử lý thông thường.

0

Tôi nghĩ rằng bạn đang nói về hai điều khác nhau:

  1. lỗi xảy ra khi một cái gì đó đã đi sai trong khuôn khổ bản thân, hoặc khung được sử dụng trong một cách mà nó không nên làm việc.
  2. Mã trạng thái HTTP (404 trang Không tìm thấy được đề cập trong chủ đề là mã trạng thái).

Trong trường hợp đầu tiên, hãy loại trừ ngoại lệ là cách phù hợp để thực hiện, nếu bạn muốn giải quyết vấn đề bằng cách sử dụng phương pháp định hướng đối tượng. Mã trạng thái HTTP là một phần của giao thức HTTP và khung của bạn không được xử lý chúng theo bất kỳ cách nào.

+0

OOP không có gì liên quan đến việc ném ngoại lệ (Khung hay không). Điều duy nhất quan trọng là liệu đó có phải là một tình huống có thể được giải quyết hay không. Nếu tình hình nghiêm trọng đến nỗi ứng dụng về cơ bản phải ném lên, thì có một ngoại lệ tốt đẹp với các chi tiết về vấn đề là tốt. Tuy nhiên, nếu đó là thứ mà bạn có thể làm việc xung quanh bằng cách nói cho người dùng biết họ không thể làm điều đó, yêu cầu thêm thông tin hoặc bằng cách sử dụng một đường dẫn khác với lệnh, thì không sử dụng ngoại lệ vì vấn đề là khá không có thai. – NotMe

+0

"Mã trạng thái HTTP là một phần của giao thức HTTP và khung của bạn không được xử lý chúng theo bất kỳ cách nào". Có một số tình huống mà tôi muốn trả lại 404 nếu không có thông tin chứa trong các mô hình của tôi, chắc chắn cách duy nhất để làm điều này là kích hoạt lỗi 404 trong mã của tôi? –

+0

Chỉ vì tò mò, có bao nhiêu ngôn ngữ không sử dụng OOP thực sự hỗ trợ ném ngoại lệ? Tôi đã được sử dụng để thấy rằng mã trả lại được sử dụng thay vì ném ngoại lệ. Vì vậy, vì điều này tôi đã nghĩ rằng các ngôn ngữ lập trình theo một số mô hình khác hơn là OOP không hỗ trợ chúng. Có lẽ tôi đã sai rồi. – pkainulainen

2

Ngoại lệ không phải là cơ chế kiểm soát lưu lượng.

+0

Đó là một tuyên bố táo bạo. Bạn có thể vui lòng xây dựng? – itsafire

Các vấn đề liên quan