Ruby 라이브러리 (gem) 또는 Ruby on Rails 애플리케이션에서 사용자 정의 오류 유형을 정의하는 가장 좋은 방법이 있습니까? 구체적으로 특별히:
- 프로젝트에서 구조적으로 어디에 속합니까? 다른 곳에 관련 모듈 / 클래스 정의가있는 별도의 파일?
- 때 설정 어떤 규칙이 있는가 에 때 하지 않는 새로운 오류 유형을 만들 수는?
라이브러리마다 작업 방식이 다르며 실제 패턴을 보지 못했습니다. 일부 라이브러리는 항상 사용자 정의 오류 유형을 사용하지만 다른 라이브러리는 전혀 사용하지 않습니다. 일부는 StandardError를 확장하는 모든 오류가 있고 다른 일부는 중첩 된 계층이 있습니다. 일부는 빈 클래스 정의이고 다른 일부는 모든 종류의 영리한 트릭을 가지고 있습니다.
아, 그리고이 “오류 유형”이라고 부르는 느낌이 모호하기 때문에, 이것이 의미하는 바는 다음과 같습니다.
class AuthenticationError < StandardError; end
class InvalidUsername < AuthenticationError; end
답변
보석
이런 식으로 예외를 정의하는 것을 여러 번 보았습니다.
gem_dir / lib / gem_name / exceptions.rb
다음과 같이 정의됩니다.
module GemName
class AuthenticationError < StandardError; end
class InvalidUsername < AuthenticationError; end
end
이것의 예는 httparty 에서 이와 같은 것입니다 .
Ruby on Rails의 경우
lib / 폴더에 exceptions.rb라는 파일 아래에 두십시오.
module Exceptions
class AuthenticationError < StandardError; end
class InvalidUsername < AuthenticationError; end
end
그리고 당신은 이것을 다음과 같이 사용할 것입니다 :
raise Exceptions::InvalidUsername
답변
프로젝트에 응집력있는 소스 파일을 가지려면 클래스에서 오류를 발생시키고 다른 곳에서는 던질 수없는 오류를 정의해야한다고 생각합니다.
일부 계층 구조는 도움이 될 수 있습니다. 네임 스페이스는 중복 문자열을 유형 이름에서 벗어나는 데 유용하지만 맛이 더 중요합니다. ‘의도적’과 ‘우발적’예외 사례 사이.
답변
레일에서 app/errors
디렉토리 를 만들 수 있습니다
# app/errors/foo_error.rb
class FooError < StandardError; end
스프링 / 서버를 다시 시작하면 픽업해야합니다
답변
이것은 오래된 질문이지만 오류 메시지 첨부, 테스트 및 ActiveRecord
모델 로 처리하는 방법을 포함하여 Rails에서 사용자 정의 오류를 처리하는 방법을 공유하고 싶었습니다 .
맞춤 오류 만들기
class MyClass
# create a custome error
class MissingRequirement < StandardError; end
def my_instance_method
raise MyClass::MissingRequirement, "My error msg" unless true
end
end
테스트 (최소)
test "should raise MissingRequirement if ____ is missing"
# should raise an error
error = assert_raises(MyClass::MissingRequirement) {
MyClass.new.my_instance_method
}
assert error.message = "My error msg"
end
ActiveRecord로
ActiveRecord
모델로 작업하는 경우 인기있는 패턴은 아래 설명과 같이 모델에 오류를 추가하여 유효성 검사에 실패하는 것입니다.
def MyModel < ActiveRecord::Base
validate :code_does_not_contain_hyphens
def code_does_not_contain_hyphens
errors.add(:code, "cannot contain hyphens") if code.include?("-")
end
end
유효성 검사가 실행되면이 메서드는 ActiveRecord의 ActiveRecord::RecordInvalid
오류 클래스 로 피기 백되어 유효성 검사에 실패합니다.
도움이 되었기를 바랍니다!
답변
여러 사용자 정의 오류 클래스에 대해 Rails 4.1.10에서 자동로드가 예상대로 작동하도록하려면 각각에 대해 별도의 파일을 지정해야합니다. 이것은 동적으로 다시로드하여 개발에서 작동해야합니다.
이것은 최근 프로젝트에서 오류를 설정하는 방법입니다.
에 lib/app_name/error/base.rb
module AppName
module Error
class Base < StandardError; end
end
end
다음과 같은 후속 사용자 정의 오류에서 lib/app_name/error/bad_stuff.rb
module AppName
module Error
class BadStuff < ::AppName::Error::Base; end
end
end
그러면 다음을 통해 오류를 호출 할 수 있습니다.
raise AppName::Error::BadStuff.new("Bad stuff just happened")