Подтвердить что ты не робот

Получение списка существующих классов ошибок Rails для повторного использования/наследования

Мне часто приходится бросать пользовательскую (ized) ошибку. Например, когда ресурс не может быть найден из-за несоответствия параметров или так.

Я предпочитаю бросать существующие ошибки или бросать ошибку, которая унаследована от существующей ошибки. Таким образом, я не представляю классы ошибок, которые уже были определены и могут быть использованы отлично (DRY). Но это также позволяет сохранить формулировку и стиль одинаково, наследуя и просто меняя слово или два, чтобы прояснить разницу с исходной ошибкой.

Например:

Foo.new
Foo.some_external_id = nil
Foo.fetch_external_resource
# => InvalidOptions: Calling Foo#fetch_external_resource with nil is invalid

Я уверен, что такие ошибки уже определены. Фактически, после прочтения многих строк кода, я обнаружил, что мой драйвер MongoID имеет Mongoid::Errors::InvalidOptions: Calling Document#find with nil is invalid.

Есть ли список доступных классов ошибок в Ruby Core и Ruby on Rails? Есть ли способ получить такой список для вашего текущего проекта?

Является ли вообще разумным повторное использование и/или наследование существующих ошибок, или я должен сохранить собственный собственный пользовательский набор?

4b9b3361

Ответ 1

Здесь в основном есть адекватное решение: http://www.ruby-forum.com/topic/158088

Поскольку этот вопрос остается без ответа, но все же он поднялся вверху результатов поиска Google, я решил обернуть решение Фредерика Чунга в задаче грабли и опубликовать его здесь.

Отбросьте следующее в lib/tasks/exceptions.rake

namespace :exceptions do
  task :list => :environment do
    exceptions = []

    ObjectSpace.each_object(Class) do |k|
      exceptions << k if k.ancestors.include?(Exception)
    end

    puts exceptions.sort { |a,b| a.to_s <=> b.to_s }.join("\n")
  end
end

Запустите его с помощью

bundle exec rake exceptions:list

Если вы все еще на Rails 2 или не используете Bundler, оставьте bundle exec

Этот список, вероятно, является адекватным, но не исчерпывающим. Например, ActiveResource определяет несколько исключений, таких как ActiveResource::ConnectionError и ActiveResource::TimeoutError, которые не появляются при выполнении этой задачи. Может быть, кто-то еще может рассказать мне, почему.

Ответ 2

Хотя этот список может измениться, и лучше всего использовать решение Ryan, список для Rails 4 (ограничен Rails-классами, а не другими драгоценными камнями):

AbstractController::ActionNotFound
AbstractController::DoubleRenderError
AbstractController::Error
AbstractController::Helpers::ClassMethods::MissingHelperError
ActionController::ActionControllerError
ActionController::BadRequest
ActionController::InvalidAuthenticityToken
ActionController::MethodNotAllowed
ActionController::MissingFile
ActionController::NotImplemented
ActionController::ParameterMissing
ActionController::RedirectBackError
ActionController::RenderError
ActionController::RoutingError
ActionController::SessionOverflowError
ActionController::UnknownController
ActionController::UnknownFormat
ActionController::UnknownHttpMethod
ActionController::UnpermittedParameters
ActionController::UrlGenerationError
ActionDispatch::Cookies::CookieOverflow
ActionDispatch::IllegalStateError
ActionDispatch::Journey::Router::RoutingError
ActionDispatch::ParamsParser::ParseError
ActionDispatch::RemoteIp::IpSpoofAttackError
ActionDispatch::Session::SessionRestoreError
ActionView::Helpers::NumberHelper::InvalidNumberError
ActiveModel::ForbiddenAttributesError
ActiveModel::MissingAttributeError
ActiveRecord::ActiveRecordError
ActiveRecord::AdapterNotFound
ActiveRecord::AdapterNotSpecified
ActiveRecord::AssociationTypeMismatch
ActiveRecord::AttributeAssignmentError
ActiveRecord::ConfigurationError
ActiveRecord::ConnectionNotEstablished
ActiveRecord::ConnectionTimeoutError
ActiveRecord::DangerousAttributeError
ActiveRecord::DeleteRestrictionError
ActiveRecord::DuplicateMigrationNameError
ActiveRecord::DuplicateMigrationVersionError
ActiveRecord::EagerLoadPolymorphicError
ActiveRecord::HasAndBelongsToManyAssociationForeignKeyNeeded
ActiveRecord::HasManyThroughAssociationNotFoundError
ActiveRecord::HasManyThroughAssociationPointlessSourceTypeError
ActiveRecord::HasManyThroughAssociationPolymorphicSourceError
ActiveRecord::HasManyThroughAssociationPolymorphicThroughError
ActiveRecord::HasManyThroughCantAssociateNewRecords
ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection
ActiveRecord::HasManyThroughCantDissociateNewRecords
ActiveRecord::HasManyThroughNestedAssociationsAreReadonly
ActiveRecord::HasManyThroughSourceAssociationNotFoundError
ActiveRecord::HasOneThroughCantAssociateThroughCollection
ActiveRecord::IllegalMigrationNameError
ActiveRecord::ImmutableRelation
ActiveRecord::InvalidForeignKey
ActiveRecord::InverseOfAssociationNotFoundError
ActiveRecord::IrreversibleMigration
ActiveRecord::MultiparameterAssignmentErrors
ActiveRecord::NestedAttributes::TooManyRecords
ActiveRecord::PendingMigrationError
ActiveRecord::PreparedStatementInvalid
ActiveRecord::ReadOnlyAssociation
ActiveRecord::ReadOnlyRecord
ActiveRecord::RecordInvalid
ActiveRecord::RecordNotDestroyed
ActiveRecord::RecordNotFound
ActiveRecord::RecordNotSaved
ActiveRecord::RecordNotUnique
ActiveRecord::Rollback
ActiveRecord::SerializationTypeMismatch
ActiveRecord::StaleObjectError
ActiveRecord::StatementInvalid
ActiveRecord::SubclassNotFound
ActiveRecord::Tasks::DatabaseAlreadyExists
ActiveRecord::Tasks::DatabaseNotSupported
ActiveRecord::ThrowResult
ActiveRecord::TransactionIsolationError
ActiveRecord::Transactions::TransactionError
ActiveRecord::UnknownAttributeError
ActiveRecord::UnknownMigrationVersionError
ActiveRecord::UnknownPrimaryKey
ActiveRecord::WrappedDatabaseException
ActiveSupport::JSON::Encoding::CircularReferenceError
ActiveSupport::MessageVerifier::InvalidSignature
ActiveSupport::SafeBuffer::SafeConcatError
ActiveSupport::XMLConverter::DisallowedType

Ответ 3

Более короткий вариант доступен в Rails благодаря ActiveSupport:

puts Exception.descendants.sort_by(&:name)

Вы также можете проверить источник, чтобы узнать, как они его обрабатывают.