[RUBY-ON-RAILS] 구조, 시작과 루비 확인?
RUBY-ON-RAILS구조, 시작과 루비 확인?
나는 최근 루비 프로그래밍을 시작했습니다, 나는 예외 처리에서 찾고 있어요.
C #에서 마지막의 루비 상응이었다 보장 궁금 해서요? 나는이 있어야합니다
file = File.open("myFile.txt", "w")
begin
file << "#{content} \n"
rescue
#handle the error here
ensure
file.close unless file.nil?
end
또는 나는이 작업을 수행해야합니까?
#store the file
file = File.open("myFile.txt", "w")
begin
file << "#{content} \n"
file.close
rescue
#handle the error here
ensure
file.close unless file.nil?
end
아무리 예외가 발생되지 않은 경우에도 무엇을 호출되지받을 수 있도록 하는가?
해결법
-
==============================
1.예, 코드는 항상 평가 보장하지만을 보장합니다. 이 보장이라고하는 이유입니다. 그래서,이 자바와 C #과 동일합니다 '마지막이야.
예, 코드는 항상 평가 보장하지만을 보장합니다. 이 보장이라고하는 이유입니다. 그래서,이 자바와 C #과 동일합니다 '마지막이야.
의 일반적인 흐름은 구조 / 다른 / /이 같은 최종 모습을 확인 / 시작 :
begin # something which might raise an exception rescue SomeExceptionClass => some_variable # code that deals with some exception rescue SomeOtherException => some_other_variable # code that deals with some other exception else # code that runs only if *no* exception was raised ensure # ensure that this code always runs, no matter what # does not change the final value of the block end
당신은 구조를 떠나 다른 확인 또는 수 있습니다. 당신은 또한 당신의 예외 처리 코드에서 예외를 검사 할 수 없습니다 경우의 변수를 남길 수 있습니다. (글쎄, 당신은 항상 제기 된 마지막 예외를 액세스하기 위해 글로벌 예외 변수를 사용할 수 있습니다,하지만 약간의 해키.) 그리고 당신은 StandardError에서 상속이 잡힐 것으로이 경우 모든 예외의 예외 클래스를 생략 할 수 있습니다. 예외의 인스턴스하지만 대부분 매우 심각한 예외하지 StandardError.입니다 예외가 있기 때문에 (주이이 모든 예외가 잡힌 것을 의미하지 않는다하시기 바랍니다 타협 등 SystemStackError, NoMemoryError, 오류 SecurityError, NotImplementedError, LoadError 같은 프로그램의 무결성, 구문 에러, ScriptError, 인터럽트, SignalException 또는 SystemExit없이.)
일부 블록은 암시 적 예외 블록을 형성한다. 예를 들어, 메소드 정의는 예외 블록, 그래서 대신 쓰기도 암시 적이다
def foo begin # ... rescue # ... end end
그냥 쓰기
def foo # ... rescue # ... end
또는
def foo # ... ensure # ... end
같은 클래스 정의 및 모듈 정의에 적용됩니다.
그러나, 당신에 대해 요구하는 특정의 경우에, 실제로는 훨씬 더 나은 관용구가있다. 당신은 당신이 마지막에 정리해야 할 몇 가지 자원과 작업 할 때 일반적으로, 당신은 당신을 위해 모든 정리 작업을 수행하는 방법에 블록을 전달하여 그렇게. 그것은 루비 당신이 산에서 내려와 기꺼이 당신을 위해 자신의 컴파일러를 변경하는 마이크로 소프트의 대제사장 기다릴 필요가 없습니다 것을 충분히 강력한 실제로 것을 제외하고, C #에서 사용하는 블록과 유사합니다. 루비에, 당신은 스스로를 구현할 수 있습니다 :
# This is what you want to do: File.open('myFile.txt', 'w') do |file| file.puts content end # And this is how you might implement it: def File.open(filename, mode='r', perm=nil, opt=nil) yield filehandle = new(filename, mode, perm, opt) ensure filehandle&.close end
그리고 당신이 아는 건 :이 File.open 같은 핵심 라이브러리에 이미 사용할 수 있습니다. 그러나 그것은 당신이 또는 거래 또는 어떤 다른 당신이 생각할 수있는 (라 C #에서 사용하는) 리소스 정리의 어떤 종류를 구현하기위한뿐만 아니라 자신의 코드에 사용할 수있는 일반적인 패턴이다.
획득하고 자원을 해제하는 경우이 작업을하지 않는 유일한 경우는 프로그램의 다른 부분을 통해 배포됩니다. 이 지역화 경우에, 당신의 예에서와 같이, 당신은 쉽게 이러한 자원 블록을 사용할 수 있습니다.
BTW : 루비 스타일의 자원 블록을 직접 구현할 수 있기 때문에 현대 C #으로 사용하여 실제로 불필요 :
class File { static T open<T>(string filename, string mode, Func<File, T> block) { var handle = new File(filename, mode); try { return block(handle); } finally { handle.Dispose(); } } } // Usage: File.open("myFile.txt", "w", (file) => { file.WriteLine(contents); });
-
==============================
2.상기 코드의 실행은 다음의 예외 처리기를 계속하기 전에 FYI 예외가 구출 부에 다시 발생하더라도 보장 블록이 실행된다. 예를 들어 :
상기 코드의 실행은 다음의 예외 처리기를 계속하기 전에 FYI 예외가 구출 부에 다시 발생하더라도 보장 블록이 실행된다. 예를 들어 :
begin raise "Error!!" rescue puts "test1" raise # Reraise exception ensure puts "Ensure block" end
-
==============================
3.당신이 폐쇄 된 파일을 확인하려면 당신은 File.open의 블록 양식을 사용한다 :
당신이 폐쇄 된 파일을 확인하려면 당신은 File.open의 블록 양식을 사용한다 :
File.open("myFile.txt", "w") do |file| begin file << "#{content} \n" rescue #handle the error here end end
-
==============================
4.예, 어떤 상황에서 호출되어 있는지 확인합니다. 자세한 내용은 "예외, 캐치, 그리고 던지기"를 참조 프로그래밍 루비 책의 및 "확인"을 검색합니다.
예, 어떤 상황에서 호출되어 있는지 확인합니다. 자세한 내용은 "예외, 캐치, 그리고 던지기"를 참조 프로그래밍 루비 책의 및 "확인"을 검색합니다.
-
==============================
5.예,이 블록을 시작으로 당신이 file.close을 필요가 없습니다가, 때마다 실행됩니다 보장을 보장합니다.
예,이 블록을 시작으로 당신이 file.close을 필요가 없습니다가, 때마다 실행됩니다 보장을 보장합니다.
그런데, 테스트 할 수있는 좋은 방법은하는 것입니다 :
begin # Raise an error here raise "Error!!" rescue #handle the error here ensure p "=========inside ensure block" end
당신은 예외가있을 때 "========= 내부 블록을 보장"인쇄 될 것입니다 있는지 확인하기 위해 테스트 할 수 있습니다. 그런 다음 오류가 발생 문을 주석하고 확인 문이 아무것도 인쇄됩니다 경우 확인하여 실행하면 볼 수 있습니다.
-
==============================
6.우리가 보장 할 필요 이유입니다 :
우리가 보장 할 필요 이유입니다 :
def hoge begin raise rescue raise # raise again ensure puts 'ensure' # will be executed end puts 'end of func' # never be executed end
-
==============================
7.예, 블록이 실행됩니다 마지막으로 보장 같은 보장합니다. 이 중요한 자원이 예를 들어, 보호되고 있는지 만들기위한 매우 유용합니다 오류에 파일 핸들을 닫는 또는 뮤텍스를 해제.
예, 블록이 실행됩니다 마지막으로 보장 같은 보장합니다. 이 중요한 자원이 예를 들어, 보호되고 있는지 만들기위한 매우 유용합니다 오류에 파일 핸들을 닫는 또는 뮤텍스를 해제.
from https://stackoverflow.com/questions/2191632/begin-rescue-and-ensure-in-ruby by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레일에서 사용자 지정 구성 변수를 정의하는 방법 (0) | 2020.02.05 |
---|---|
[RUBY-ON-RAILS] 어떻게 "꽤"레일에 루비 내 JSON 출력을 포맷 할 수 있습니다? (0) | 2020.02.05 |
[RUBY-ON-RAILS] 어떻게 루비에서 객체의 전체 복사본을 만드는 방법? (0) | 2020.02.05 |
[RUBY-ON-RAILS] 동적 조건 has_many 레일 (0) | 2020.02.05 |
[RUBY-ON-RAILS] 이 속성 또는 메서드를 지원하지 않는 개체 윈도우 64 비트 레일 (0) | 2020.02.05 |