Ruby on Rails 2.1 - Xử lý ngoại lệ

Thực thi và ngoại lệ luôn đi cùng nhau. Nếu bạn đang mở một tệp không tồn tại, thì bạn cần phải xử lý tình huống này đúng cách, nếu không chương trình của bạn được coi là có chất lượng không đạt tiêu chuẩn.

Chương trình dừng nếu một ngoại lệ xảy ra. Các ngoại lệ được sử dụng để xử lý các loại lỗi khác nhau, có thể xảy ra trong quá trình thực thi chương trình và thực hiện hành động thích hợp thay vì dừng chương trình hoàn toàn.

Xử lý ngoại lệ trong Ruby on Rails tương tự như xử lý ngoại lệ trong Ruby. Có nghĩa là, chúng tôi gửi kèm mã có thể tạo ra một ngoại lệ trong khối bắt đầu / kết thúc và sử dụng các mệnh đề cứu hộ để cho Ruby biết các loại ngoại lệ mà chúng tôi muốn xử lý.

Cú pháp

begin  
   # -  
      rescue OneTypeOfException  
   # -  
      rescue AnotherTypeOfException  
   # -  
   else  
      # Other exceptions
      ensure
   # Always will be executed
end

Mọi thứ từ đầu đến cứu đều được bảo vệ. Nếu một ngoại lệ xảy ra trong quá trình thực thi khối mã này, quyền kiểm soát sẽ được chuyển cho khối giữa cứu hộkết thúc .

Đối với mỗi mệnh đề cứu trong khối bắt đầu , Ruby lần lượt so sánh Ngoại lệ được nâng lên với từng tham số. Trận đấu sẽ thành công nếu ngoại lệ được đặt tên trong mệnh đề cứu giống với kiểu của ngoại lệ hiện đang được ném ra hoặc là một lớp cha của ngoại lệ đó.

Ghi lỗi ở đâu?

Bạn có ba tùy chọn khi một ngoại lệ được ném ra -

  • Đăng nhập vào tệp nhật ký nội bộ (logger.error)

  • Hiển thị thông báo thích hợp cho người dùng

  • Hiển thị lại trang gốc để tiếp tục

Việc báo lỗi cho ứng dụng được thực hiện đối với một cấu trúc được gọi là flash . Các đèn flash là một xô băm để chứa thông điệp của bạn đến khi yêu cầu tiếp theo trước khi bị xóa tự động. Bạn có thể truy cập nó bằng biến @flash. Đưa ra dưới đây là hình thức đơn giản nhất của việc sử dụng logger module để đăng thông báo lỗi trong một tập tin nội bộ.

begin
.........
rescue Exception => exc
   logger.error("Message for the log file #{exc.message}")
   flash[:notice] = "Store error message"
   redirect_to(:action => 'index')
end

Để hiển thị tất cả các thông báo từ @flash trong chế độ xem hoặc bố cục (.html.erb) của bạn, bạn có thể thêm các thông báo sau:

<% @flash[:notice] -%>
<div id="notice"><%= @flash[:notice] %></div>
<% end -%>