2009-09-20 37 views
6

Tôi đã tự hỏi tiêu chuẩn ngoại trừ để xử lý lỗi trong Mô hình là gì.Xử lý lỗi trong mô hình (MVC)

Hiện tại tôi có các phương thức 'setError' và 'getError' đang được sử dụng bởi tất cả các Mô hình của tôi.

Điều này có nghĩa là tôi chỉ quan tâm đến việc liệu cuộc gọi đến một phương thức trong Mô hình của tôi là đúng hay sai. Nếu đó là sai thì tôi sẽ sử dụng $this->model->getError() trong Bộ điều khiển của tôi.

Ngoài ra, tôi đang dự tính thiết lập một tệp riêng có chứa tất cả các lỗi của tôi. Một tệp cho mỗi mô hình, cũng muốn có suy nghĩ về điều này.

Trả lời

3

Giải pháp đơn giản hơn là sử dụng exceptions.

Khi xảy ra lỗi sẽ là thứ bạn hiển thị cho người dùng, hãy ném một loại ngoại lệ đặc biệt - có thể có tên là UserError. Ngoại lệ phải chứa văn bản của thông báo lỗi khi bạn ném nó. Những loại lỗi rất tính năng mà cung cấp cho người dùng với thông tin hữu ích (ví dụ: họ đã cố gắng xóa một cái gì đó không tồn tại - có thể xảy ra khi họ có nhiều trình duyệt mở, vv)

ví dụ:

throw new UserError("That object no longer exists."); 

Khi xảy ra lỗi mà bạn muốn ẩn khỏi người dùng, hãy ném một loại ngoại lệ khác, có lẽ tên là InternalError. Bạn sẽ muốn đăng nhập điều này và cho phép chương trình tiếp tục, do đó, lỗi cụ thể bị ẩn khỏi người dùng. Nếu nó ngăn chặn một cái gì đó xảy ra, bạn có thể muốn ném một thông báo lỗi chung chung. Đây sẽ là lỗi và bạn muốn khắc phục chúng càng sớm càng tốt.

ví dụ .:

throw new InternalError("Failed to connect to remote service"); 

Tất cả các thông báo lỗi có thể được lưu trữ (hard-coded) trong nguồn nơi ngoại lệ được ném. Đây không nhất thiết phải là một thực hành thiết kế tồi - nếu bạn sử dụng một công cụ như gettext, bạn có thể dễ dàng dịch tất cả các thông báo này.

+0

Tôi thích ý tưởng đó, báo trước duy nhất là nếu có nhiều lỗi lý tưởng tôi muốn ghi lại lỗi khi tiếp tục thực hiện. Do đó tại sao tôi đã sử dụng setError và getError. Tôi kiểm tra xem trả lại có đúng hay không, nghĩa là mọi hành động đã thành công và nếu tôi không nhận được lỗi. Một hành động của tôi là một phần thành công, và kết quả là tôi muốn trả về false và sử dụng getError để nhận được thông báo cho biết phần nào đã không thành công. Hy vọng có ý nghĩa. – Andre

1

Tôi đã sử dụng log4j và log4cxx và đăng nhập vào syslogd. Kiwi là một syslogger Win32 đơn giản sẽ theo dõi các thông điệp tường trình của bạn và lưu chúng vào một tập tin. Log4j/Log4cxx có các tệp cấu hình mà bạn có thể sử dụng để thiết lập tất cả các cấp độ đăng nhập của bạn hoặc các đích thư đăng nhập (bạn có thể đăng nhập vào nhiều địa điểm).

Cần quá ít nỗ lực để thiết lập và sử dụng, và nó hoạt động như một sự quyến rũ.

Tôi chưa thử tự mình log4php.

Trường hợp ngoại lệ là tốt khi bạn không muốn chương trình của mình tiếp tục thực thi nữa. Bắt ngoại lệ ở mức cao, nơi bạn có thể chấp nhận sự sụp đổ của các hành quyết thất bại.

1

Xem lại NerdDinner hướng dẫn về làm thế nào để tạo thói quen xác nhận trước khi đưa ra quyết định cuối cùng:

http://nerddinnerbook.s3.amazonaws.com/Part3.htm

Phần Validation là khoảng 2/3 con đường phía dưới trang.