Làm thế nào để sử dụng giải cứu trong Ruby mà không có khối bắt đầu và kết thúc


115

Tôi biết về kỹ thuật tiêu chuẩn để bắt đầu cứu hộ

Làm thế nào để người ta chỉ sử dụng khối cứu hộ của riêng nó.

Nó hoạt động như thế nào và làm thế nào nó biết mã nào đang được giám sát?


Câu trả lời:


223

Phương thức "def" có thể dùng như một câu lệnh "begin":

def foo
  ...
rescue
  ...
end

3
Ngoài ra, định nghĩa lớp, định nghĩa mô-đun và (tôi nghĩ) do/ endkhối ký tự tạo thành các khối ngoại lệ ngầm định.
Jörg W Mittag,

bạn có thể làm giải cứu def đảm bảo kết thúc tốt không?
Mohamed Hafez

Bạn hoàn toàn có thể thực hiện giải cứu def cũng đảm bảo kết thúc :-)
Antony

bạn có thể sử dụng nhiều hơn một cứu hộ trong def của bạn không?
marriedjane875

@ marriedjane875 vâng, bạn có thể sử dụng nhiều giải cứu, hoặc rõ ràng (mỗi điều khoản / khối giải cứu trên dòng riêng của nó) như rescue TypeError; rescue NameError- hoặc bạn có thể phân tách các lớp ngoại lệ bằng dấu phẩy, ví dụrescue TypeError, NameError
chemturion

48

Bạn cũng có thể giải cứu nội tuyến:

1 + "str" rescue "EXCEPTION!"

sẽ in ra "EXCEPTION!" vì 'Chuỗi không thể bị ép buộc vào Fixnum'


1
Làm thế nào để bạn giải cứu và hiển thị nội tuyến ngoại lệ backtrace?
Cyril Duchon-Doris

làm thế nào để trả về ngoại lệ thực tế?
user1735921

1
Giải cứu nội tuyến không phải là một phương pháp hay vì nó giải cứu StandardErrorvà tất cả các lớp con của nó, như NameError- nghĩa là ngay cả một lỗi đánh máy trong mã của bạn cũng không gây ra lỗi .. Xem thinkbot.com/blog/don-t-inline-rescue-in- hồng ngọc .
BrunoFacca 19/09/19

26

Tôi đang sử dụng kết hợp def / Rescue rất nhiều với xác thực ActiveRecord:

def create
   @person = Person.new(params[:person])
   @person.save!
   redirect_to @person
rescue ActiveRecord::RecordInvalid
   render :action => :new
end

Tôi nghĩ rằng đây là mã rất nạc!


19

Thí dụ:

begin
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
ensure
  # ensure that this code always runs
end

Đây, defnhư một begintuyên bố:

def
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
ensure
  # ensure that this code always runs
end
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.