2011-08-30 33 views
15

Đây là tình huống. Tôi muốn tất cả các ngoại lệ trong doStuff() để bong bóng thông qua mã để chúng được xử lý ở mức cao hơn.Ngoại lệ reraising ruby ​​w/đối số chuỗi bổ sung

Tôi cũng muốn ghi lại mức độ thường xuyên trường hợp ngoại lệ nào đang xảy ra trong doStuff() ở mức cao hơn là tốt, và hiện đang làm điều này:

begin 
    doStuff() 
rescue Exception => 
    raise e, "specific error to log in a db" 

doStuff đang ném hàng chục trường hợp ngoại lệ, và tôi muốn nắm bắt từng sự kiện này để đưa vào db. Có một doStuff2(), cũng có thể ném các lệnh giống hệt nhau và tôi muốn biết chúng xuất phát từ chức năng nào.

Thêm chuỗi bổ sung, dường như thay đổi ngoại lệ, và tôi mất tất cả thông tin định dạng và theo dõi tốt đẹp mà ngoại lệ ban đầu có.

Bất kỳ đề xuất nào về cách tôi có thể làm lại ngoại lệ ban đầu, nhưng cũng theo dõi tất cả các ngoại lệ xảy ra trong doStuff()?

Trả lời

48

Nếu bạn gọi raise mà không chuyển bất kỳ đối số nào, Ruby sẽ tăng lại ngoại lệ cuối cùng.

begin 
    doStuff() 
rescue => e 
    log_exception(e) 
    raise # This will re-raise the last exception. 
end 

Lưu ý, tôi muốn cung cấp cho bạn một số gợi ý về các phương pháp hay nhất của Ruby.

  1. Phương thức doStuff() không tuân theo quy ước đặt tên của Ruby. Bạn nên sử dụng dấu gạch dưới cho các phương thức. Vui lòng sử dụng do_stuff. Ngoài ra, không cần sử dụng () nếu không có đối số.
  2. Không bao giờ giải cứu Ngoại lệ, thay vào đó hãy giải cứu lớp cấp thấp nhất bạn cần giải cứu. Trong hầu hết các trường hợp, bạn có thể muốn giải cứu tất cả các loại StandardError hoặc RuntimeError. Trong thực tế, nếu bạn sử dụng giải cứu mà không qua loại lỗi, Ruby sẽ tự động giải cứu bất kỳ lớp con của StandardError. Exception lớp là rất thấp và nó sẽ bắt lỗi cú pháp là tốt, và một số vấn đề trình biên dịch khác. Bạn có thể muốn cho phép ứng dụng gặp sự cố trong trường hợp này để bạn không triển khai một ứng dụng bị hỏng.
+0

doStuff() chỉ là giả mã, xin lỗi. Vấn đề là tôi không thể đăng nhập ngoại lệ ở đây. Việc khai thác gỗ phải xảy ra ở mức cao hơn. Ứng dụng này là 'câm' và không biết bất cứ điều gì về cơ sở dữ liệu hoặc đăng nhập. Tôi biết tôi không thể tăng 2 ngoại lệ cùng một lúc, nhưng điều này sẽ giải quyết được vấn đề của tôi. Một trong số họ sẽ bị bắt và đăng nhập, và một người khác sẽ vẫn bị bong bóng trong mã. –

2

Bạn không thể tăng ngoại lệ mới và lưu ngoại lệ trước đó và ngăn xếp ngăn xếp của nó ra khỏi hộp. Các ngoại lệ lồng nhau từ thế giới Java không phải là ở đây ra khỏi hộp không may. Nó sẽ có sẵn trong Ruby 2.1. Đó là một chủ đề khá nóng. https://bugs.ruby-lang.org/issues/8257

Bạn vẫn có thể sử dụng đá quý nesty để có nó. Những gì bạn chỉ cần là include Nesty::NestedError trong các lớp học ngoại lệ của bạn. Thông tin chi tiết ở đây: https://github.com/skorks/nesty/

3

Bạn có thể lưu vết lùi và sứ điệp của các ngoại lệ đầu tiên và xây dựng một ngoại lệ mới nhằm nâng cao

begin 
rescue Exception => e 
    new_ex = Exception.new("Error while executing ...:#{e.message}") 
    new_ex.set_backtrace(e.backtrace) 
    raise new_ex 
end 
Các vấn đề liên quan