Từ khóa fail làm gì trong Ruby?


88

Tôi đang học Ruby và gặp failtừ khóa. Nó có nghĩa là gì?

if password.length < 8
   fail "Password too short"
end
unless  username
   fail "No user name set"
end

8
Ngoài các câu trả lời bên dưới, giá trị của nó mà mọi người biết raisekhi xử lý các ngoại lệ và failkhi không.
Bala

6
Nó không phải là một từ khóa, nó là một phương pháp.
Jörg W Mittag,

Tài liệu: Kernel # fail
Jared Beck,

Cũng lưu ý, bạn có thể viết những điều này dưới dạng câu lệnh một dòng: fail "Password too short" if password.length < 8fail "No user name set" unless username
PhilT

Câu trả lời:


136

Trong Ruby, failđồng nghĩa với raise. Các failtừ khóa là một phương pháp của Kernelmô-đun được bao gồm bởi lớp Object. Các failphương pháp làm nảy sinh một lỗi thời gian chạy giống như các raisetừ khóa.

Các failphương pháp có ba quá tải:

  • fail: tăng a RuntimeErrormà không có thông báo lỗi.

  • fail(string): tăng a RuntimeErrorvới đối số chuỗi dưới dạng thông báo lỗi:

    fail "Failed to open file"
    
  • fail(exception [, string [, array]]): đưa ra một ngoại lệ của lớp exception(đối số đầu tiên) với thông báo lỗi tùy chọn (đối số thứ hai) và thông tin gọi lại (đối số thứ ba).

    Ví dụ: Giả sử bạn xác định một hàm sẽ bị lỗi nếu đưa ra một đối số không hợp lệ. Tốt hơn là tăng một ArgumentErrorchứ không phải RuntimeError:

    fail ArgumentError, "Illegal String"
    

    Ví dụ khác: Bạn có thể vượt qua toàn bộ vết lùi đến failphương pháp để bạn có thể truy cập vào các dấu vết bên trong rescuekhối:

    fail ArgumentError, "Illegal String", caller
    

    callerlà một phương thức Kernel trả về backtrace dưới dạng một mảng các chuỗi trong biểu mẫu file:line: in 'method'.

Không có đối số, tăng ngoại lệ trong $! hoặc tăng RuntimeError nếu $! là con số không. Với một đối số Chuỗi duy nhất, tạo ra RuntimeError với chuỗi dưới dạng thông báo. Nếu không, tham số đầu tiên phải là tên của một lớp Ngoại lệ (hoặc một đối tượng trả về một đối tượng Ngoại lệ khi được gửi một thông báo ngoại lệ). Tham số thứ hai tùy chọn đặt thông báo được 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. Các ngoại lệ được bắt bởi mệnh đề cứu hộ của khối begin ... end.

Nguồn: Tài liệu Ruby về Kernel Module .


2
Bạn có thể đưa ra 3 ví dụ đơn giản với 3 gạch đầu dòng không? Nó sẽ làm cho câu trả lời của bạn cụ thể hơn .. :)
Arup Rakshit

1
Wow, +1, crazybob của tốt hơn so với Ruby docs ruby-doc.org/core-2.0.0/Kernel.html#method-i-raise :-)))
Boris Stitnicky

Nó hoạt động với tôi nhưng Rubocop đã chuyển đổi nó thànhraise
paul

32

Rubocop nói về cách sử dụng của cả hai từ;

'Sử dụng failthay vì raiseđể báo hiệu ngoại lệ.'

'Sử dụng raisethay vì failđể ném lại các ngoại lệ.'

Đây là một ví dụ.

def sample
  fail 'something wrong' unless success?
rescue => e
  logger.error e
  raise
end

+1 cho tư vấn phong cách; ngay cả khi họ đang giống hệt ngữ nghĩa sử dụng mỗi trong bối cảnh dự định của họ sẽ giúp truyền đạt ý định tốt hơn
fatuhoku

26

fail == raise

Nói cách khác, failchỉ là một bí danh phổ biến cho raisephương pháp sửa lỗi. Sử dụng:

fail ArgumentError, "Don't argue with me!"

7

www.ruby-doc.org là bạn của bạn. Khi tôi googled rubydoc fail" Kernel " là lần đầu tiên bị tấn công. Lời khuyên của tôi là, khi nghi ngờ, hãy tìm đến nguồn cuối cùng để biết những thứ chắc chắn như thế này.


2
Woot, đó thực sự là một sự THẤT BẠI. Mã ví dụ cho Fail là copy-paste từ tăng o_O
Vajk Hermecz

4
@VajkHermecz fail là một bí danh của việc tăng lương, vì vậy nó sử dụng lại tài liệu. So sánh với các tài liệu cho mảng # đồ và Array # thu thập
Jamie Macey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.