Ruby의 일반적인 문제는 기술적인 용어로 "예외"라고 하는 오류 메시지가 표시된다는 것입니다.
이러한 예외는 예상될 수 있습니다. , 때로는 사용할 수 있지만 다른 파일에는 없는 파일 또는 일부 제한으로 인해 일시적으로만 사용할 수 있는 API 또는 예기치 않은 .
오늘은 예상되는 오류를 관리하는 방법을 배웁니다.
어떻게?
자, Ruby에서 오류 조건을 처리하는 데 사용되는 두 가지 중요한 키워드인 "시작"과 "구조"를 소개하겠습니다.
어떻게 작동합니까?
먼저 무엇인가를 이해해야 합니다.
Ruby 프로그램이 실행되는 동안 여러 지점에서 오류가 발생할 수 있습니다.
예: :
- 존재하지 않는 파일을 읽으려고 합니다.
- 숫자를 0으로 나누기.
- 사용 중인 웹 서버에 오래된 SSL 인증서가 있습니다.
오류가 발생하면... Ruby는 즉시 충돌하지 않습니다!
오류에서 복구할 수 있는 기회를 얻습니다. . 이를 "예외 처리"라고 합니다.
Ruby는 코드에서 오류 복구를 구현하기 위한 몇 가지 키워드를 제공합니다. 이 키워드는 begin
입니다. &rescue
.
사용법을 알아봅시다!
루비 예외 처리 방법
이러한 예외를 어떻게 처리합니까?
예외를 발생시키는 코드를 begin
으로 래핑할 수 있습니다. / rescue
차단합니다.
작동 방식은 다음과 같습니다...
첫 번째 섹션(begin
), 실행할 코드가 있고 예외가 발생할 수 있습니다.
예 :
begin IO.sysopen('/dev/null') rescue # ... end
여기서 sysopen
으로 파일을 열려고 합니다. . 파일을 열 수 없으면 예외가 발생합니다.
지금이 rescue
를 사용하기에 완벽한 시간입니다. 키워드!
이 키워드를 사용하면 예외가 발생했을 때 어떤 일이 일어나길 원하는지 말할 수 있습니다. 따라서 실패 모드는 제어할 수 있습니다.
예 :
begin IO.sysopen('/dev/null') rescue puts "Can't open IO device." end
이 오류를 기록하고 어떤 종류의 기본값을 제공하려고 합니다.
하지 않다. 무시하다. 오류.
여러 예외 구조
rescue
를 알아야 합니다. 선택적 인수를 취합니다.
이 주장은 무엇입니까?
이 인수는 예외 클래스입니다. 당신이 구출하고 싶은.
실행 중인 코드에 따라 다릅니다.
IO
의 경우 :
Errno::ENOENT
일 수 있습니다. 누락된 파일에 대해- 또는
Errno::EACCES
권한 오류
가장 좋은 점은?
동일한 시작/구조 블록에서 여러 예외를 처리할 수 있습니다.
좋아요 :
begin IO.sysopen('/dev/null') rescue Errno::ENOENT puts "File not found." rescue Errno::EACCES puts "Insufficient permissions, not allowed to open file." end
여러 예외에 대해 동일한 작업이 발생하도록 하려면...
할 수 있습니다 :
begin IO.sysopen('/dev/null') rescue Errno::ENOENT, Errno::EACCES puts "There was an error opening the file." end
계속 배워봅시다!
블록 및 메서드 내에서 예외를 구하는 방법
항상 begin
을 사용할 필요는 없습니다. 키워드.
생략할 수 있는 경우가 있습니다.
어디?
내부 메서드 및 블록.
예 :
def get_null_device IO.sysopen('/dev/null') rescue Errno::ENOENT puts "Can't open IO device." end
메소드 정의 자체가 begin
의 작업을 수행합니다. , 생략할 수 있습니다.
블록을 사용하여 이 작업을 수행할 수도 있습니다.
예 :
["a.txt", "b.txt", "c.txt"].map do |f| IO.sysopen(f) rescue Errno::ENOENT puts "Can't open IO device: #{f}." end
이제 rescue
를 사용하는 방법이 하나 더 있습니다. begin
이 없는 키워드 .
어떻게 작동하는지 봅시다.
인라인 구조 이해 및 위험한 이유
rescue
를 사용할 수 있습니다. 인라인.
드문 경우지만 이러한 형태의 예외 처리가 유용할 수 있습니다.
예시 :
["a.txt", "b.txt", "c.txt"].select { |f| File.open(f) rescue nil }.map(&:size)
이렇게 하면 존재하는 파일만 열 수 있고 존재하지 않는 파일은 무시할 수 있습니다.
결과적으로 기존 파일의 크기를 얻게 됩니다.
예외가 발생하지 않습니다.
이 작업을 수행하는 이유는 무엇입니까?
코드를 한 줄에 모두 유지할 수 있습니다.
그게 다야.
이 형식의 rescue
를 사용할 때 "숨겨진 위험"이 있습니다. StandardError
에서 내림차순으로 모든 예외가 발생하기 때문입니다. .
가장 예외적인 경우입니다.
왜 좋지 않습니까?
다양한 예외를 선택하는 대신 특정 예외만 처리하는 것이 가장 좋기 때문입니다.
이렇게 하면 자신에게 오류를 숨기는 것을 방지할 수 있습니다!
숨겨진 오류는 모든 종류의 이상한 동작 및 디버그하기 어려운 문제로 이어질 수 있습니다.
요약
Ruby의 오류, 기본 예외 처리 및 rescue
에 대해 배웠습니다. / begin
키워드.
도움이 되셨다면 이 글을 공유해주세요 🙂
읽어주셔서 감사합니다!