복붙노트

[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. ==============================

    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. ==============================

    2.상기 코드의 실행은 다음의 예외 처리기를 계속하기 전에 FYI 예외가 구출 부에 다시 ​​발생하더라도 보장 블록이 실행된다. 예를 들어 :

    상기 코드의 실행은 다음의 예외 처리기를 계속하기 전에 FYI 예외가 구출 부에 다시 ​​발생하더라도 보장 블록이 실행된다. 예를 들어 :

    begin
      raise "Error!!"
    rescue
      puts "test1"
      raise # Reraise exception
    ensure
      puts "Ensure block"
    end
    
  3. ==============================

    3.당신이 폐쇄 된 파일을 확인하려면 당신은 File.open의 블록 양식을 사용한다 :

    당신이 폐쇄 된 파일을 확인하려면 당신은 File.open의 블록 양식을 사용한다 :

    File.open("myFile.txt", "w") do |file|
      begin
        file << "#{content} \n"
      rescue
      #handle the error here
      end
    end
    
  4. ==============================

    4.예, 어떤 상황에서 호출되어 있는지 확인합니다. 자세한 내용은 "예외, 캐치, 그리고 던지기"를 참조 프로그래밍 루비 책의 및 "확인"을 검색합니다.

    예, 어떤 상황에서 호출되어 있는지 확인합니다. 자세한 내용은 "예외, 캐치, 그리고 던지기"를 참조 프로그래밍 루비 책의 및 "확인"을 검색합니다.

  5. ==============================

    5.예,이 블록을 시작으로 당신이 file.close을 필요가 없습니다가, 때마다 실행됩니다 보장을 보장합니다.

    예,이 블록을 시작으로 당신이 file.close을 필요가 없습니다가, 때마다 실행됩니다 보장을 보장합니다.

    그런데, 테스트 할 수있는 좋은 방법은하는 것입니다 :

    begin
      # Raise an error here
      raise "Error!!"
    rescue
      #handle the error here
    ensure
      p "=========inside ensure block"
    end
    

    당신은 예외가있을 때 "========= 내부 블록을 보장"인쇄 될 것입니다 있는지 확인하기 위해 테스트 할 수 있습니다. 그런 다음 오류가 발생 문을 주석하고 확인 문이 아무것도 인쇄됩니다 경우 확인하여 실행하면 볼 수 있습니다.

  6. ==============================

    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. ==============================

    7.예, 블록이 실행됩니다 마지막으로 보장 같은 보장합니다. 이 중요한 자원이 예를 들어, 보호되고 있는지 만들기위한 매우 유용합니다 오류에 파일 핸들을 닫는 또는 뮤텍스를 해제.

    예, 블록이 실행됩니다 마지막으로 보장 같은 보장합니다. 이 중요한 자원이 예를 들어, 보호되고 있는지 만들기위한 매우 유용합니다 오류에 파일 핸들을 닫는 또는 뮤텍스를 해제.

  8. from https://stackoverflow.com/questions/2191632/begin-rescue-and-ensure-in-ruby by cc-by-sa and MIT license