[ruby-on-rails] Ruby 및 / 또는 Rails에서 사용자 정의 오류 유형을 정의 할 위치는 어디입니까?

Ruby 라이브러리 (gem) 또는 Ruby on Rails 애플리케이션에서 사용자 정의 오류 유형을 정의하는 가장 좋은 방법이 있습니까? 구체적으로 특별히:

  1. 프로젝트에서 구조적으로 어디에 속합니까? 다른 곳에 관련 모듈 / 클래스 정의가있는 별도의 파일?
  2. 때 설정 어떤 규칙이 있는가 하지 않는 새로운 오류 유형을 만들 수는?

라이브러리마다 작업 방식이 다르며 실제 패턴을 보지 못했습니다. 일부 라이브러리는 항상 사용자 정의 오류 유형을 사용하지만 다른 라이브러리는 전혀 사용하지 않습니다. 일부는 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")


답변