예외 처리.

10136 단어 Ruby초학자
나는 예외 처리를 조사해 이 문장비긴~rescue~ensure와raise를 이용한 예외 처리 프로세스 및 포착을 보았지만 하는 일을 잘 몰라서 잘 조사해 보았다.
class ExceptionTest
  def test
    begin
      # 0での除算でエラーを発生させる
      1/0
    rescue ZeroDivisionError => ex
      puts "ZeroDivisionError"
    end
  end
end

obj = ExceptionTest.new
# 例外発生
obj.test # => ZeroDivisionError
대체 뭘 검증하는 건지...
그래서 1부터 다시 한다.
main.rb
begin
  1 / 0
rescue
  puts "何か問題が発生しました。"
end
이것은 매우 알기 쉬워서 자주 사용한다.begin과rescue 사이의 처리에 문제가 발생하면 오류로 인해 멈추지 않고rescue와end에서 처리합니다.
main.rb
begin
  1 / 0
rescue
  puts "何か問題が発生しました。"
end
puts 'ok'

#=> 何か問題が発生しました。
#=> ok
그래도 멈추지 않고 끝까지 처리할 거야.
begin과rescue를 사용하지 않으면 오류로 인해 멈출 수 있습니다.
main.rb
1 / 0
puts 'ok'

#=> main.rb:1:in `/': divided by 0 (ZeroDivisionError)
#=>     from main.rb:1:in `<main>'

첫 번째 줄에 '0 파열 없음' 오류가 있어서 'ok' 을 표시하지 않습니다.
다음은 흔히 볼 수 있는 이거.
main.rb
begin
  1 / 0
rescue => e
  puts "何か問題が発生しました。"
  p e
end
puts 'ok'

#=> 何か問題が発生しました。
#=> #<ZeroDivisionError: divided by 0>
#=> ok
이것은 잘못된 내용을 e에 넣으세요.Begin~rescue 사이의 처리에서 Zero Division Error가 발생한 것 같습니다.class ZeroDivisionError
그럼 이 부분에 관해서 재미있는 루비(Rubby)를 보세요. 위에'예외 대상을 변수에 대입하라'고 쓰여 있습니다.그리고 예외 대상은 방법이 있는 것 같습니다.
main.rb
begin
  1 / 0
rescue => e
  p e.class
  p e.message
  p e.backtrace
end
#=> ZeroDivisionError
#=> "divided by 0"
#=> ["main.rb:2:in `/'", "main.rb:2:in `<main>'"]
예외 대상은 예외류의 실례 대상입니까?
참고서를 보니 예외반이 많았다.

내장 라이브러리
※ 계속
다음은 참고 사이트의 이 부분을 찾아보세요.
rescue ZeroDivisionError => ex
rescue 다음에 반을 지정하면 그 예외만 rescue인 것 같습니다.
main.rb
begin
  1 / 0
rescue ZeroDivisionError
  puts "対象の例外やー。"
end

#=> 対象の例外やー。
0으로 나누면 오류는 Zero Division Error이므로 이건 제대로 행동해야 한다.
그러나 매개변수가 부족한 오류이므로 ArgumentError를 지정해야 합니다.
main.rb
def full_name(firstname, lastname)
  puts firstname + lastname
end

begin
  full_name("taro")
rescue ZeroDivisionError
  puts "対象の例外やー。"
end

#=> main.rb:1:in `full_name': wrong number of arguments (1 for 2) (ArgumentError)
#=>     from main.rb:6:in `<main>'
main.rb
def full_name(firstname, lastname)
  puts firstname + lastname
end

begin
  full_name("taro")
rescue ArgumentError
  puts "対象の例外やー。"
end

#=> 対象の例外やー。
여기에 와서야 원래 페이지의 이 부분에서 무엇을 검증하고 있는지 알게 되었다.
class ExceptionTest
  def test
    begin
      # 0での除算でエラーを発生させる
      1/0
    rescue StandardError => ex
      puts "StandardError"
    rescue ZeroDivisionError => ex
      puts "ZeroDivisionError"
    end
  end
end

obj = ExceptionTest.new
# 例外発生
obj.test # => StandardError
StandardError는 ZeroDivisionError의 부류이기 때문에 StandardError와 ZeroDivisionError는 모두 대상의 예외로 0의 제법 오류를 포착할 수 있다.이 상황을 검증했을까요?
흔하지만 잘 이해되지 않는 레이스를 살펴보자.
예외가 발생하다.첫 번째 형식은 이전의 예외가 다시 발생할 것이다.두 번째 형식에서는 매개변수가 문자열인 경우 런타임에rror 예외가 발생하여 문자열을 메시지로 보냅니다.
레이스에 예외가 생길 것 같아요.특별히 지정하지 않으면 RuntimeError가 생성됩니다.
main.rb
raise "RunTimeError??"

#=> main.rb:1:in `<main>': RunTimeError?? (RuntimeError)
main.rb
raise ArgumentError

#=> main.rb:1:in `<main>': ArgumentError (ArgumentError)
main.rb
raise ArgumentError, "ArgumentErrorだよー"

#=> main.rb:1:in `<main>': ArgumentErrorだよー (ArgumentError)
이런 느낌으로 지정하면 예외를 자유롭게 조종할 수 있다.
그나저나 RunTime Error
특정 예외 클래스에 속하지 않는 오류가 발생할 수 있습니다.Kerne.#RuntimeError는 레이스에 예외 클래스가 지정되지 않은 경우에도 발생합니다.
이런 거.여기까지 생각났어요. raise와if문이 연결되었어요.
main.rb
def kufuku_gauge(energy)
   true if energy > 100
end

def eating_dinner
  raise "既に満腹!" if kufuku_gauge(120)
  puts "食事の時間だ!"
end

eating_dinner

#=> main.rb:6:in `eating_dinner': 既に満腹! (RuntimeError)
#=> from main.rb:10:in `<main>'
이런 느낌으로 잘못된 메시지를 보냈다.오류를 식별하고 싶을 때 편리합니다!
이 지경에 이르렀으니 나도 원 보도의 뜻을 이해할 수 있게 되었다.

좋은 웹페이지 즐겨찾기