2011-01-26 44 views

Trả lời

100

Về mặt kỹ thuật, người đầu tiên đặt ra một RuntimeError với thông điệp thiết lập để "foo", và lần thứ hai đặt ra một ngoại lệ với thông điệp thiết lập để "foo".

Thực tế, có sự khác biệt đáng kể giữa thời điểm bạn muốn sử dụng tên cũ và khi bạn muốn sử dụng sau.

Nói một cách đơn giản, bạn có thể muốn một số RuntimeError không phải là Exception. Khối cứu trợ không có đối số sẽ bắt được RuntimeErrors, nhưng sẽ KHÔNG bắt được Exception giây. Vì vậy, nếu bạn tăng một Exception trong mã của bạn, mã này sẽ không bắt nó:

begin 
rescue 
end 

Để bắt Exception bạn sẽ phải làm điều này:

begin 
rescue Exception 
end 

Điều này có nghĩa rằng trong một cảm giác , số Exception là lỗi "tệ hơn" so với số RuntimeError, bởi vì bạn phải làm nhiều việc hơn để khôi phục từ đó.

Vì vậy, điều bạn muốn phụ thuộc vào cách dự án của bạn xử lý lỗi. Ví dụ, trong daemon của chúng ta, vòng lặp chính có một cuộc giải cứu trống sẽ bắt giữ RuntimeErrors, báo cáo chúng, và sau đó tiếp tục. Nhưng trong một hoặc hai trường hợp, chúng tôi muốn các daemon thực sự thực sự chết trên một lỗi, và trong trường hợp đó chúng tôi nâng cao một Exception, mà đi thẳng qua "mã xử lý lỗi bình thường" của chúng tôi và ra ngoài. Một lần nữa, nếu bạn đang viết mã thư viện, bạn có thể muốn RuntimeError, không phải là Exception, vì người dùng thư viện của bạn sẽ ngạc nhiên nếu nó làm tăng lỗi mà khối trống rescue không thể bắt được và sẽ mất họ một chút thời gian để nhận ra lý do tại sao.

Cuối cùng, tôi phải nói rằng RuntimeError là một lớp con của lớp StandardError, và nguyên tắc thực tế là mặc dù bạn có thể raisebất kỳ loại đối tượng, trống rescue Mặc định nó sẽ chỉ bắt bất cứ điều gì được thừa kế từ StandardError .Mọi thứ khác phải cụ thể.

+1

rất thông tin, cảm ơn. một vài điều: [1] Đoạn cuối cùng là chiếu sáng nhất, và cho phép tôi khám phá ra một thứ gì đó mà bạn không đề cập đến: 'RuntimeError

+1

[1, 2] Đúng. [3] không chắc chắn ... [4] Khi tôi mã hóa chuyên nghiệp nhất, tôi có xu hướng tạo các kiểu lỗi tùy chỉnh kế thừa từ 'StandardError'. Nó không phải phức tạp hơn một vài dòng như 'class MissingArgumentsError

+0

Rất nhiều thông tin, nhưng theo loại tình huống nào bạn sẽ muốn ném ngoại lệ hơn là lỗi thời gian chạy nếu lỗi thời gian chạy được ưu tiên để viết libraray? –

26

From the offical documentation:

raise 
raise(string) 
raise(exception [, string [, array ] ]) 

Với không có đối số, làm tăng ngoại lệ trong $! hoặc đặt ra một RuntimeError nếu $! là con số không. Với một đối số String duy nhất, nó tăng một số RuntimeError bằng chuỗi dưới dạng tin nhắn. Nếu không, tham số đầu tiên phải là tên của lớp Exception (hoặc đối tượng trả về Exception khi ngoại lệ đã gửi). Tham số thứ hai tùy chọn thiết lập thông điệp liên kết với ngoại lệ, và tham số thứ ba là một mảng thông tin gọi lại. Trường hợp ngoại lệ bị bắt theo điều khoản giải cứu của các khối begin...end.

raise "Failed to create socket" 
raise ArgumentError, "No parameters", caller 
Các vấn đề liên quan