Tôi đã tự hỏi liệu mọi người có chia sẻ các phương pháp/chiến lược hay nhất của họ về xử lý ngoại lệ & lỗi hay không. Bây giờ tôi không hỏi khi nào nên ném một ngoại lệ (nó đã được trả lời một cách thô bạo ở đây: SO: When to throw an Exception). Và tôi không sử dụng điều này cho luồng ứng dụng của mình - nhưng có những trường hợp ngoại lệ hợp pháp xảy ra mọi lúc. Ví dụ, cái phổ biến nhất là ActiveRecord :: RecordNotFound. Điều gì sẽ là cách tốt nhất để xử lý nó? Cách DRY?Chiến lược tốt nhất để xử lý các ngoại lệ và lỗi trong Rails là gì?
Ngay bây giờ tôi đang thực hiện rất nhiều kiểm tra trong bộ điều khiển của mình vì vậy nếu Post.find(5)
trả về Nil - tôi kiểm tra điều đó và gửi một thông báo flash. Tuy nhiên trong khi điều này rất chi tiết - nó hơi cồng kềnh theo nghĩa tôi cần kiểm tra các ngoại lệ như trong mọi bộ điều khiển, trong khi hầu hết chúng đều giống nhau và phải làm với bản ghi không tìm thấy hoặc các bản ghi liên quan không tìm thấy - là một trong hai Post.find(5)
không tìm thấy hoặc nếu bạn đang cố gắng để hiển thị bình luận liên quan đến bài viết mà không tồn tại, đó sẽ ném một ngoại lệ (giống như Post.find(5).comments[0].created_at
)
tôi biết bạn có thể làm một cái gì đó như thế này trong ApplicationController và ghi đè lên nó sau này trong một bộ điều khiển/phương thức cụ thể để nhận hỗ trợ chi tiết hơn, tuy nhiên đó có phải là cách thích hợp để thực hiện điều đó không?
class ApplicationController < ActionController::Base
rescue_from ActiveRecord::RecordInvalid do |exception|
render :action => (exception.record.new_record? ? :new : :edit)
end
end
Ngoài ra điều này sẽ làm việc trong trường hợp Post.find(5)
không tìm thấy, nhưng những gì về Post.find(5).comments[0].created_at
- Tôi có nghĩa là tôi không thể ném một ngoại lệ thổi đầy đủ nếu bài tồn tại nhưng không có ý kiến, phải không?
Để tóm tắt cho đến nay tôi đã thực hiện rất nhiều kiểm tra thủ công bằng cách sử dụng if/else/trừ khi hoặc case/when (và thỉnh thoảng tôi thú nhận bắt đầu/cứu) và kiểm tra nil? hoặc trống rỗng ?, v.v., nhưng có vẻ tốt hơn.
Trả lời:
@Milan: Hi Milan Cám ơn bài trả lời - Tôi đồng ý với những gì bạn nói, và tôi nghĩ tôi lạm dụng ngoại trừ từ. Điều tôi ngụ ý là ngay bây giờ tôi làm rất nhiều việc như:
if Post.exists?(params[:post_id])
@p = Post.find(params[:post_id])
else
flash[:error] = " Can't find Blog Post"
end
Và tôi thực hiện rất nhiều loại "xử lý ngoại lệ", tôi cố gắng tránh sử dụng bắt đầu/cứu hộ. Nhưng có vẻ như với tôi rằng đây là một kết quả/xác minh/tình huống đủ phổ biến mà cần phải có một cách DRYer để làm điều này, phải không? Bạn sẽ làm loại séc này như thế nào?
Còn cách xử lý trong trường hợp này? Giả sử bạn muốn hiển thị ngày tạo nhận xét trong chế độ xem của bạn:
Last comment for this post at : <%= @post.comments[0].created_at %>
Và bài đăng này không có bất kỳ nhận xét nào. Bạn có thể làm
Last comment for this post at : <%= @post.comments.last.created_at unless @post.comments.empty? %>
Bạn có thể làm bộ kiểm soát. Vv Có một số cách để làm điều đó. Nhưng cách "tốt nhất" để xử lý điều này là gì?
Hãy - xem trả lời của tôi ở trên trong câu trả lời - Tôi không thể gửi mã đúng thụt vào trong các ý kiến :-) – konung
Hey Nick, xin lỗi vì nghe có vẻ rất ranty. Tôi chỉ không có đủ thời gian để thêm bất kỳ phần xây dựng nào vào câu trả lời của tôi. Bây giờ, nó ở đó. Hy vọng toàn bộ câu trả lời đó là hữu ích hơn bây giờ. –
Không vấn đề gì - không có hành vi phạm tội nào, câu hỏi của tôi cũng không rõ lắm - cho đến khi tôi dọn sạch nó. Bạn đã cho tôi một vài con trỏ tốt - Tôi sẽ chờ một chút, có lẽ ai đó có thêm vài gợi ý và sau đó tôi sẽ đánh dấu câu trả lời này. Cảm ơn bạn đã trả lời chi tiết. :-) – konung