Latest web development tutorials

루비 예외

예외 및 실행은 항상 연결되어 있습니다. 당신이 상황을 존재하지, 제대로 처리하지 않는 파일을 열 경우, 프로그램은 낮은 품질로 간주됩니다.

예외가 발생하면, 프로그램은 멈춘다. 이렇게 적절한 조치를 취하도록, 프로그램 실행 중에 발생하고, 프로그램이 완전히 정지 못하게 에러 모든 종류의 예외 처리.

루비는 예외를 처리하기위한 완벽한 메커니즘을 제공합니다. 우리는 예외를 throw 할 수있는 코드를 부착하고, 예외의 완벽한 유형은/ 끝을 시작블록에서 처리 할 루비에게구조절을 사용할 수 있습니다.

문법

begin #开始
 
 raise.. #抛出异常
 
rescue [ExceptionType = StandardException] #捕获指定类型的异常 缺省值是StandardException
 $! #表示异常信息
 $@ #表示异常出现的代码位置
else #其余异常
 ..
ensure #不管有没有异常,进入该代码块
 
end #结束

구조가보호에서 모든 것을시작합니다.코드 블록 예외의 실행 중에 발생하는 경우, 제어는단부블록구조사이를통과한다.

에 대한 블록 각 매개 변수 비교에 차례로 던져 각구조 절,루비와 예외를시작합니다.복구 절 네이밍 예외 및 예외 유형이 동일한 전류에 의해 발생, 또는 예외의 상위 클래스 인 경우, 경기는 성공적이었다.

예외가 오류의 지정된 유형과 일치하지 않을 경우, 우리는구조 절다른 절을사용할 수 있습니다.

#!/usr/bin/ruby

begin
   file = open("/unexistant_file")
   if file
      puts "File opened successfully"
   end
rescue
      file = STDIN
end
print file, "==", STDIN, "\n"

위의 출력의 예는 실행 중입니다. 당신이수 있듯이오픈이실패했기때문에,STDIN은파일을교체합니다.

#<IO:0xb7d16f84>==#<IO:0xb7d16f84>

사용재시도 문

당신은 예외를 잡기 위해구조 블록을사용하고 처음부터시작을시작재시도 문블록을 사용할 수 있습니다.

문법

begin
    # 这段代码抛出的异常将被下面的 rescue 子句捕获
rescue
    # 这个块将捕获所有类型的异常
    retry  # 这将把控制移到 begin 的开头
end

#!/usr/bin/ruby

begin
   file = open("/unexistant_file")
   if file
      puts "File opened successfully"
   end
rescue
   fname = "existant_file"
   retry
end

다음은 처리 흐름이다 :

  • 열 때 예외가 발생했습니다.
  • 구출 건너 뜁니다. FNAME는 재 할당 될 수있다.
  • 처음으로 건너 뛰기은 재 시도에 의해 시작합니다.
  • 파일이 성공적으로 열립니다.
  • 기본 과정을 계속합니다.

주 : 이름이 바뀐 파일이 존재하지 않는 경우,이 힘 코드를 무제한 시도.그래서,주의재 시도를예외 처리사용합니다.

사용raise

당신은raise문은 예외가 발생 할 수 있습니다. 다음과 같은 방법을 사용하면 전화 예외가 발생합니다. 두 번째 메시지가 출력됩니다.

문법

raise 

或

raise "Error Message" 

或

raise ExceptionType, "Error Message"

或

raise ExceptionType, "Error Message" condition

(A RuntimeError에 던져 아니 현재 예외가없는 경우) 첫 번째 형태는 단순히 현재 예외를 다시 throw합니다. 이는 수신 예외 예외 예외 핸들러 전에 설명하기 위해 사용된다.

두 번째 형태는 주어진 문자열의 메시지를 설정 한 새RuntimeError에 예외를만듭니다. 통화 후 예외를 던져 스택.

예외를 만들 수있는 첫 번째 매개 변수의 세 번째 형태는 다음 두 번째 매개 변수로 관련 메시지를 설정합니다.

네 번째 형태와 세 번째 형태는 비슷합니다, 당신은 예외를 던져(예를 제외하고)추가 조건문을 추가 할 수 있습니다.

#!/usr/bin/ruby

begin  
    puts 'I am before the raise.'  
    raise 'An error has occurred.'  
    puts 'I am after the raise.'  
rescue  
    puts 'I am rescued.'  
end  
puts 'I am after the begin block.'  

위의 예제 출력은 실행

I am before the raise.  
I am rescued.  
I am after the begin block.  

또 다른 데모인상의사용 예 :

#!/usr/bin/ruby

begin  
  raise 'A test exception.'  
rescue Exception => e  
  puts e.message  
  puts e.backtrace.inspect  
end  

위의 예제 출력은 실행

A test exception.
["main.rb:4"]

문장의 사용을확인

때때로, 예외 발생과 상관없이, 일부 프로세스는 코드 블록의 끝에서 완료되도록 할 필요가있다. 예를 들어, 당신은 당신이 블록을 종료 할 때, 당신은 파일을 닫을 수 있는지 확인해야합니다 항목의 시간에 파일을 열 수 있습니다.

이것이다 할 수있는 조항을보장합니다.마지막 구조 절 뒤에 배치 및 포함되도록 블록 종단 코드 블록이 항상 실행된다. 블록을 종료 던져의 캐치되지 않는 예외가 종료 때문인지, 이러한관계의어느것도,블록이 항상 실행됩니다 보장하지 여부를 예외를 처리하는 정상입니다.

문법

begin 
   #.. 过程
   #.. 抛出异常
rescue 
   #.. 处理错误 
ensure 
   #.. 最后确保执行
   #.. 这总是会执行
end

begin
  raise 'A test exception.'
rescue Exception => e
  puts e.message
  puts e.backtrace.inspect
ensure
  puts "Ensuring execution"
end

위의 예제 출력은 실행

A test exception.
["main.rb:4"]
Ensuring execution

다른문을 사용하여

다른 절을제공하는 경우 어떤확인하기전에, 그것은 일반적으로,구조 절이후에배치됩니다.

신체다른조항이 실행되는 경우에만 예외를 throw하지 않고 코드의 몸.

문법

begin 
   #.. 过程 
   #.. 抛出异常
rescue 
   #.. 处理错误
else
   #.. 如果没有异常则执行
ensure 
   #.. 最后确保执行
   #.. 这总是会执行
end

begin
 # 抛出 'A test exception.'
 puts "I'm not raising exception"
rescue Exception => e
  puts e.message
  puts e.backtrace.inspect
else
   puts "Congratulations-- no errors!"
ensure
  puts "Ensuring execution"
end

위의 예제 출력은 실행

I'm not raising exception
Congratulations-- no errors!
Ensuring execution

사용 $! 변수가 발생 오류 메시지를 잡을 수 있습니다.

잡아 던져

때때로 당신은 몇 가지 중첩 구조의 정상적인 과정에서 이동해야 높이고 오류가 발생하면 복구 예외 메커니즘은 실행을 제공 할 수 있습니다. 이 시점 캐치에서와 편리하게 던져.

캐치는주어진 이름을 정의하는 블록으로 라벨 (기호 나 문자열이 될 수 있음). 블록은 일반적으로 만남을 던져 알고 실행됩니다.

문법

throw :lablename
#.. 这不会被执行
catch :lablename do
#.. 在遇到一个 throw 后匹配将被执行的 catch
end

或

throw :lablename condition
#.. 这不会被执行
catch :lablename do
#.. 在遇到一个 throw 后匹配将被执行的 catch
end

사용자 유형 '!'어떤 프롬프트에 응답하는 경우 다음의 예는, 사용자와의 상호 작용을 종료 던져를 사용합니다.

def promptAndGet(prompt)
   print prompt
   res = readline.chomp
   throw :quitRequested if res == "!"
   return res
end

catch :quitRequested do
   name = promptAndGet("Name: ")
   age = promptAndGet("Age: ")
   sex = promptAndGet("Sex: ")
   # ..
   # 处理信息
end
promptAndGet("Name:")

위의 프로그램은 인간의 상호 작용이 필요합니다, 당신은 당신의 컴퓨터에 시도 할 수 있습니다. 위의 예제 출력은 실행

Name: Ruby on Rails
Age: 3
Sex: !
Name:Just Ruby

예외 클래스

루비의 표준 클래스 및 모듈가 발생합니다. 모든 예외 클래스는 내부 예외 클래스 상단 포함 계층 구조를 형성한다. 다음 층은 일곱 가지 유형이다 :

  • 인터럽트
  • NoMemoryError
  • SignalException
  • ScriptError
  • StandardError
  • SystemExit없이

다른 치명적인 예외의 층이지만, 루비 인터프리터는 내부적으로 만 사용.

ScriptError 및 StandardError 몇 가지 하위 범주가 있지만 여기에서 우리는 이러한 세부 사항을 알 필요가있다. 가장 중요한 것은 우리 자신의 예외 클래스를 만드는 것입니다, 그들은 클래스 예외 또는 그 자손의 서브 클래스 여야합니다.

예제를 보자 :

class FileSaveError < StandardError
   attr_reader :reason
   def initialize(reason)
      @reason = reason
   end
end

이제, 상기 예외에서 사용되는 다음의 예를 살펴 보자

File.open(path, "w") do |file|
begin
    # 写出数据 ...
rescue
    # 发生错误
    raise FileSaveError.new($!)
end
end

여기서, 가장 중요한 라인 FileSaveError.new올릴것이다 ($으로!). 우리는 때문에 쓰기가 실패 데이터에 의한 특정 이상에 새로운 인스턴스 FileSaveError을 통과, 예외가 발생한 개략적으로 인상 호출합니다.