2011-12-05 87 views
11

Tôi đến từ nền C# nơi tôi thường nâng cao ngoại lệ với ngoại lệ ban đầu chứa bên trong ngoại lệ gốc. Là một khái niệm tương tự có sẵn trong Ruby? Làm cách nào để phát hiện và tăng ngoại lệ trong khi duy trì ngữ cảnh của ngoại lệ cấp thấp hơn?ruby ​​- tăng ngoại lệ với ngoại lệ

Trả lời

14

Hãy nhìn vào các thủ thuật từ cuộc nói chuyện Exceptional Ruby bởi Avdi Grimm:

class MyError < StandardError 
    attr_reader :original 
    def initialize(msg, original=nil); 
    super(msg); 
    @original = original; 
    end 
end 
# ... 
rescue => error 
    raise MyError.new("Error B", error) 
end 
+0

Bạn không phải bao gồm thông điệp làm đối số khi thực hiện siêu (msg). Nếu bạn làm tăng MyError (lỗi), 'một số thông báo' với những thay đổi đó, 'một số thông báo' sẽ được chuyển thành một đối số ngầm định. – daremkd

4

Bạn có thể mở rộng StandardError:

class StandardError 
    attr_accessor :original 
end 

và khi bạn nâng một ngoại lệ, chỉ cần đặt khách sạn này:

def reraise ex, original 
    ex.original = original 
    raise ex 
end 

rescue StandardError => e 
    reraise ArgumentError.new('Message'), e 
end 

Với cách tiếp cận này, bạn sẽ có thể tăng tiêu chuẩn ruby ​​er rors và thiết lập lỗi cha mẹ cho họ, không chỉ lỗi tùy chỉnh của bạn.

5

Ruby 2.1 đã thêm Exception#cause tính năng để giải quyết vấn đề này.

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