source

Ruby 및/또는 Rails에서 사용자 정의 오류 유형을 정의하는 위치

itover 2023. 6. 6. 10:45
반응형

Ruby 및/또는 Rails에서 사용자 정의 오류 유형을 정의하는 위치

Ruby 라이브러리(gem) 또는 Ruby on Rails 응용 프로그램에서 사용자 정의 오류 유형을 정의하는 모범 사례가 있습니까?구체적으로:

  1. 그들은 그 프로젝트에서 구조적으로 어디에 속합니까?관련 모듈/클래스 정의에 밑줄이 그어진 별도의 파일이 다른 곳에 있습니까?
  2. 새로운 오류 유형을 생성해야 할 만들지 말아야 할 를 규정하는 규칙이 있습니까?

도서관마다 다른 방식으로 일을 처리하고, 저는 어떤 실제 패턴도 알아채지 못했습니다.일부 라이브러리는 항상 사용자 지정 오류 유형을 사용하는 반면 다른 라이브러리는 사용자 지정 오류 유형을 전혀 사용하지 않습니다. 일부 라이브러리는 표준 오류를 확장하는 모든 오류를 가진 반면 다른 라이브러리는 중첩된 계층을 가지고 있습니다. 일부 라이브러리는 빈 클래스 정의이고 다른 라이브러리는 모든 종류의 교묘한 속임수를 가지고 있습니다.

아, 그리고 제가 이러한 "오류 유형"을 부르는 것이 애매하다고 생각하기 때문에, 제 말은 다음과 같습니다.

class AuthenticationError < StandardError; end
class InvalidUsername < AuthenticationError; end

보석을 위하여

이러한 방식으로 예외를 정의하는 것을 여러 번 보았습니다.

gem_message/lib/message_name/exceptions.message

다음과 같이 정의됩니다.

module GemName

  class AuthenticationError < StandardError; end
  class InvalidUsername < AuthenticationError; end

end

이것의 예는 httparty에서 이런 것일 것입니다.

레일 위의 루비의 경우

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모형

사용자 지정 오류 만들기

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일반적인 패턴은 아래 설명된 대로 모델에 오류를 추가하여 검증이 실패하는 것입니다.

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")

언급URL : https://stackoverflow.com/questions/5200842/where-to-define-custom-error-types-in-ruby-and-or-rails

반응형