2011-01-28 25 views
11

Khi đưa ra ngoại lệ tùy chỉnh riêng của một người nhưNơi thông thường để giữ định nghĩa ngoại lệ tùy chỉnh trong dự án đường ray là gì?

class ThingExploded < StandardError; end 
class ThingIsMissing < StandardError; end 

đâu là một nơi tốt để giữ cho các? Tôi đã xem xét lib/exceptions.rb… và cũng cân nhắc xem nó có phù hợp hơn không bằng cách nào đó đặt chúng gần hơn với mã sử dụng chúng.

+1

Bạn có muốn thẻ "trường hợp ngoại lệ bị nuốt phải" hoặc "ngoại lệ" không? –

+0

cố định, cảm ơn :) –

+7

Thiết kế của Rails thường xuyên thưởng cho những thứ trong một số thư mục nhất định và trừng phạt đưa chúng đến nơi khác. Tư vấn khách quan về nơi để đặt một cái gì đó trong một dự án Rails do đó có thể được đưa ra. Tôi không đồng ý rằng câu hỏi này nên được đóng lại. –

Trả lời

1

Tôi đang đi với app/models/model_name/exceptions.rb, giữ chúng bên trong mô-đun.

+1

Miễn là bạn chỉ sử dụng chúng trong một mô hình duy nhất. – EasierSaidThanDone

+1

Bằng cách sử dụng để bạn có nghĩa là tăng? Sau đó, tôi nghĩ rằng tôi đồng ý. –

17

Tôi có thể đi với lib/exceptions/thing_exploded.rb để giữ cho mỗi lớp trong một tệp riêng biệt.

+0

Tại sao mỗi ngoại lệ phải được lưu giữ trong một tệp riêng biệt? Các lớp ngoại lệ khá đơn giản, vì vậy có thể tốt hơn nên giữ ở một nơi? – mrzasa

+1

@mrzasa Họ không phải đi trong một tệp riêng biệt nếu bạn định nghĩa các ngoại lệ cục bộ được sử dụng trong một lớp duy nhất. Tuy nhiên, nếu bạn muốn chia sẻ ngoại lệ trên ứng dụng, đây là phương pháp tôi đã đề xuất khi lib được tự động tải. Tuy nhiên, bây giờ tôi có thể chỉ cần đặt tất cả trong một tập tin và yêu cầu rõ ràng nó tương tự như cách [ActiveRecord thực hiện nó] (https://github.com/rails/rails/blob/master/activerecord/lib/active_record/errors. rb). –

+0

@PeterBrown Vì chúng chắc chắn là một phần không thể thiếu của ứng dụng, chúng sẽ xuất hiện ở đâu đó dưới 'ứng dụng', không phải' lib'. – skalee

9

Trừ khi ngoại lệ của bạn quá nghiêm trọng, chúng không được giải cứu, phân lớp chúng từ Exception không phù hợp.

Exceptions như fatalNoMemoryError là lớp con của ngoại lệ, vì vậy nếu bạn đã có mã như rescue Exception để xử lý ThingExplodedThingIsMissing, bạn muốn được giải cứu tất cả các loại công cụ phù hợp nhất còn lại một mình.

Thay vào đó, tốt hơn nên phân lớp chúng từ StandardError.

+0

'rescue Exception' cũng sẽ bắt được, hãy nhìn vào: https://gist.github.com/3c43788eabaa52ae9b98 –

+0

' rescue Exception' sẽ bắt mọi thứ, có lẽ bạn đang nghĩ về 'rescue' mà chỉ bắt' RuntimeError'? Một số cuộc thảo luận thú vị ở đây: http://stackoverflow.com/questions/4800698/what-is-the-difference-between-raise-foo-and-raise-exception-newfoo –

+0

Đã thực hiện thêm một số thử nghiệm ... giải cứu 'trần 'sẽ giải cứu 'StandardError' và bất kỳ lớp con nào của nó. 'rescue Exception' sẽ cứu bất kỳ và tất cả ngoại lệ thuộc loại nào. Tôi nghĩ rằng tôi hiểu tốt hơn lời khuyên của bạn, và tôi nghĩ rằng bạn đã giả định rằng tôi sử dụng 'cứu Ngoại lệ 'trong mã của tôi. Tôi không. Tôi luôn luôn giải quyết ngoại lệ tùy chỉnh rất cụ thể và để các trường hợp ngoại lệ khó khăn hơn lên cấp cao hơn, nơi tôi giải cứu tất cả 'Ngoại lệ', báo cáo cho nhà phát triển và ẩn chúng khỏi người dùng. –

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