Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

루비의 예외

예외 예외에 대한 정보를 보유하는 특수 데이터 구조입니다. 귀하의 응용 프로그램에서 발생하는 조건. 예외는 특정 상황을 처리하는 방법을 모르기 때문에 프로그램을 계속 실행할 수 없을 때 보내는 신호입니다. Ruby에서는 이러한 신호를 보내는 것을 raising이라고 부릅니다. 예외입니다.

raise 'this is an exception'
 
puts "This message won't be printed."

실행 중인 예외를 확인하는 가장 빠른 방법은 직접 예외를 발생시키는 것입니다. raise를 사용하여 메시지가 있는 메소드를 사용하면 Ruby는 RuntimeError를 생성합니다. 전달된 텍스트를 설명으로 사용합니다. 또한 코드에서 예외가 발생한 위치를 가리키는 스택 추적을 추가합니다.

$ ruby raise.rb
raise.rb:1:in `<main>': this is an exception (RuntimeError)

위의 예제 스크립트를 실행하면 약속한 대로 예외가 발생한 후 메시지가 인쇄되지 않는다는 것을 알 수 있습니다. 처리되지 않은 예외가 충돌을 일으켜 프로그램 실행을 중지하기 때문입니다. 이는 애플리케이션이 작업 중 하나를 완료하지 못한 후에도 계속 실행되지 않도록 하기 위한 것입니다.

다양한 유형의 예외

내부적으로 Ruby는 문제가 발생하면 예외를 발생시킵니다. 예를 들어 숫자를 0으로 나누려고 하면 예외가 발생합니다.

irb(main):001:0> 42/0
ZeroDivisionError: divided by 0
        from (irb):1:in `/'
        from (irb):1
        from /Users/jeff/.asdf/installs/ruby/2.3.0/bin/irb:11:in `<main>'

이 경우 예외 유형은 ZeroDivisionError입니다. , RuntimeError 대신 우리는 전에 보았다. Ruby의 예외 계층 구조를 구성하는 수십 가지 예외 유형이 있으며 모두 다른 상황에서 발생합니다.

RuntimeError 더 일반적인 예외 클래스이지만 더 구체적인 예가 있습니다. NoMethodError 존재하지 않는 메소드를 호출하려고 할 때 발생하고 ArgumentError 예를 들어 잘못된 인수가 기존 메서드에 전달되었음을 나타냅니다.

예외 구조

대부분의 응용 프로그램에는 예외로부터 복구하는 기능이 필요합니다. 웹 응용 프로그램에서 사용자가 양식에 잘못된 데이터를 제출하면 오류가 발생할 수 있습니다. 그러면 전체 웹 서버가 충돌하는 대신 오류 메시지가 사용자에게 표시됩니다.

이와 같은 경우 예외가 발생할 수 있지만 호출 스택의 맨 위에 도달하기 전에 웹 서버에 의해 구조되어 예외가 애플리케이션 충돌을 방지합니다.

begin
  raise 'this is an exception'
rescue RuntimeError => exception
  puts "Exception rescued: #{exception.inspect}"
  # => "Exception rescued: #<RuntimeError: this is an exception>"
end
 
puts "This message *will* be printed."

시작/구조 블록에서 이전 예제를 래핑하면 예외가 발생하지 않고 앱이 충돌하지 않습니다. 대신, 이 경우 예외가 중단되었음을 설명하는 메시지를 인쇄하는 구조 블록이 실행됩니다. 또한 이렇게 하면 앱이 충돌하는 것을 방지할 수 있으므로 마지막 메시지가 인쇄됩니다.

이 예제는 특히 RuntimeError에서 구출됩니다. s, 그래서 다른 오류가 포착되지 않습니다. 어떤 오류가 구출되는지 구체적으로 알려주면 편리합니다. 다른 오류가 발생할 때 다른 작업을 수행할 수 있기 때문입니다. 또한 너무 많은 예외를 구하지 않도록 하는 것이 중요합니다.

예외 처리에 대한 더 자세한 입문서와 예외를 적절하게 구하는 방법에 대한 몇 가지 팁은 Ruby Magic에 대한 예외 입문서를 확인하십시오.

Ruby에서 예외를 발생시키거나 잡는 방법에 대해 질문이 있습니까? 주저하지 말고 @AppSignal로 알려주십시오. 물론 이 기사가 어떻게 마음에 들었는지, 또는 더 알고 싶은 다른 주제가 있는지 알고 싶습니다.