2011-09-15 25 views
11

Ai đó có thể cho tôi biết có cách nào để xử lý ngoại lệ như một phương thức phổ biến và sử dụng nó trong một phương thức? Hãy để tôi giải thích thêm.Việc xử lý ngoại lệ như một phương thức phổ biến trong Ruby

Ví dụ, tôi có phương pháp sau đây

def add(num1, num2) 
begin 
    num1 + num2 
rescue Exception => e 
    raise e 
end 
end 

def divide(num1, num2) 
begin 
    num1/num2 
rescue Exception => e 
    raise e 
end 
end 

Như bạn có thể thấy, mặc dù phương pháp của tôi chỉ cần một dòng, vì mã xử lý ngoại lệ, phương pháp này được lớn hơn.

Những gì tôi đang tìm kiếm là một giải pháp mỏng hơn như (chỉ là một suy nghĩ)

def add(num1, num2) 
    num1 + num2 unless raise_exception 
end 

def divide(num1, num2) 
num1/num2 unless raise_exception 
end 

def raise_exception 
    raise self.Exception 
end 

Xin lưu ý các mã trên không hoạt động, chỉ là ý tưởng của tôi. Điều này có thể hay là có cách nào khác tốt?

+0

Lưu ý rằng bạn cũng có thể cắt giảm độ dài bằng cách loại bỏ 'begin..end', vì bạn có thể có' rescue' trong 'def..end' với cùng tác dụng. – hammar

Trả lời

11
def handle_exception(&block) 
    yield 
rescue Exception => e 
    raise e 
end 

def add(num1, num2) 
    handle_exception { num1 + num2 } 
end 

def divide(num1, num2) 
    handle_exception { num1/num2 } 
end 
+0

Một nhược điểm tiềm năng để xem xét là tất cả các lỗi được nêu ra sẽ trỏ đến cùng một số dòng –

+0

Đúng, nhưng đây cũng là một ví dụ giả tạo. Nếu bạn vừa mới sửa lỗi, bạn sẽ không bận tâm đến nó ngay từ đầu. Điều này sẽ hữu ích nếu bạn có một số mã xử lý lỗi phổ biến. – David

+0

@ David, cảm ơn rất nhiều, đây là một trong những tôi muốn ...: D – sameera207

0

Chắc chắn, bạn có thể chuyển một khối vào phương thức đưa ra bên trong phần bắt đầu.

+0

cảm ơn bạn đã trả lời nhanh chóng, bạn có thể hướng dẫn tôi sử dụng mẫu mã khối và mẫu sản phẩm hay không, cảm ơn bạn một lần nữa – sameera207

+0

Nó sẽ nhanh chóng giúp bạn làm điều đó :) –

+0

khắc phục sự cố của tôi, cảm ơn để được trợ giúp: D – sameera207

4

vâng, một cái gì đó như thế:

def try 
    yield 
    rescue Exception => e 
    puts 'I`m rescued' 
    end 

    def devide(num1, num2) 
    try { num1/num2 } 
    end 

ruby-1.9.2-p180 :013 > devide(5,1) 
=> 5 
ruby-1.9.2-p180 :014 > devide(5,0) 
I`m rescued 
=> nil 
+0

cảm ơn cho câu trả lời, tôi đã phải chấp nhận câu trả lời của david như ông đã đưa ra câu trả lời đầu tiên, xin lỗi .. nhưng cảm ơn một lần nữa, đây là một trong những Tôi muốn ... – sameera207

0

Tại sao bạn giải cứu một ngoại lệ và nâng cao nó bạt? Thói quen gọi điện của bạn phải giải cứu lại ngoại lệ của bạn.

Bạn có thể làm:

def divide(num1, num2) 
    num1/num2 
end 

begin 
    divide(1,0) 
rescue Exception => e 
    puts "Exception '#{e}' occured" 
end 

Bạn có thể giải cứu các ngoại lệ trong một dòng:

def divide2(num1, num2) 
    num1/num2 rescue Exception 
end 

p divide2(6,3) # -> 2 
p divide2(1,0) # -> Exception 

Nhưng sau đó bạn sẽ mất các thông tin mà ngoại lệ xảy ra.

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