2010-08-01 44 views
32

Bạn có thể tạo một lớp con của một ngoại lệ để làm cho nó mang tính mô tả hơn, nhưng bạn nên đặt thông báo 'mặc định' như thế nào?Các lớp Lỗi ngoại lệ của Ruby

class MyError < StandardError 
    # default message = "You've triggered a MyError" 
end 

begin 
    raise MyError, "A custom message" 
rescue Exception => e 
    p e.message 
end 

begin 
    raise MyError 
raise Exception => e 
    p e.message 
end 

Đầu tiên nên đầu ra 'Một thông điệp tùy chỉnh'

Thứ hai nên đầu ra 'Bạn đã kích hoạt một MyError'

Bất kỳ lời đề nghị như thực hành tốt nhất?

Trả lời

57

Xác định phương thức khởi tạo, sẽ nhận thông báo dưới dạng đối số với giá trị mặc định. Sau đó, gọi phương thức khởi tạo của StandardError bằng tin nhắn đó (sử dụng super).

class MyError < StandardError 
    def initialize(msg = "You've triggered a MyError") 
    super(msg) 
    end 
end 
+29

Chỉ cần 'super' là đủ. Nếu bạn gọi 'super' mà không có danh sách đối số, nó sẽ đơn giản truyền vào tất cả các đối số, đó là lý do tại sao, khi bạn thực sự muốn truyền tham số * no *, bạn phải gọi' super() '. –

+0

@ JörgWMittag Tại sao tất cả các lớp lỗi tùy chỉnh kế thừa từ 'StandardError'? Bất kỳ lý do đằng sau nó? –

+0

@ArupRakshit Vì két an toàn. Bất cứ khi nào giải thoát khỏi lỗi, nó phải là 'StandardError' (hoặc thấp hơn), vì các lỗi cấp cao hơn như' Exception' thậm chí có thể bị ném khi nhấn CTL-C vv. Xem phần này để biết thêm thông tin http://rails-bestpractices.com/posts/2012/11/01/don-t-rescue-exception-rescue-standarderror – Sean

1

Bạn cũng có thể ghi đè phương thức message trong lớp con của mình và trả lại chuỗi bạn muốn hiển thị. Tôi thích điều này vì nó dường như giữ cho mọi thứ sạch hơn một chút nếu bạn muốn làm bất cứ điều gì thú vị trước khi hiển thị thông báo.

class CustomError < StandardError 

    def initialize(error_code, error_info) 
    @code, @info = error_code, error_info 
    end 

    def message 
    "<Code: #{@code}> <Info: #{@info}>" 
    end 

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