시작 및 종료 블록없이 Ruby에서 구조를 사용하는 방법


115

구출 시작의 표준 기술을 알고 있습니다.

구조 블록을 단독으로 사용하는 방법은 무엇입니까?

어떻게 작동하며 어떤 코드가 모니터링되고 있는지 어떻게 알 수 있습니까?


답변:


223

"def"메소드는 "begin"문으로 사용할 수 있습니다.

def foo
  ...
rescue
  ...
end

3
또한 클래스 정의, 모듈 정의 및 (내 생각에) do/ end블록 리터럴은 암시 적 예외 블록을 형성합니다.
Jörg W Mittag 2011 년

데프 구조도 끝낼 수 있습니까?
Mohamed Hafez 2013 년

당신은 절대적으로 def 구조도 끝낼 수 있습니다 :-)
Antony

데프에서 하나 이상의 구조를 사용할 수 있습니까?
marriedjane875

@ marriedjane875 예, 명시 적으로 (각 구조의 절 / 블록이 한 줄에 있음) 여러 구조를 사용할 수 있습니다. rescue TypeError; rescue NameError또는 예외 클래스를 쉼표로 구분할 수 있습니다. 예rescue TypeError, NameError
chemturion

48

인라인으로 복구 할 수도 있습니다.

1 + "str" rescue "EXCEPTION!"

"EXCEPTION!"을 출력합니다. '문자열을 Fixnum으로 강제 할 수 없기 때문에'


1
예외 역 추적 인라인을 어떻게 구출하고 표시합니까?
Cyril Duchon-Doris

실제 예외를 반환하는 방법?
user1735921

1
인라인 구조는 구조 StandardError와 모든 하위 클래스를 구조하기 때문에 좋은 방법이 아닙니다. NameError즉 , 코드의 오타도 오류를 일으키지 않습니다. thoughtbot.com/blog/don-t-inline-rescue-in- 참조 루비 .
BrunoFacca

26

ActiveRecord 유효성 검사와 함께 def / rescue 조합을 많이 사용하고 있습니다.

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

나는 이것이 매우 간결한 코드라고 생각합니다!


19

예:

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

여기에서 defA와 begin문 :

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.