Получение списка существующих классов ошибок 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? Есть ли способ получить такой список для вашего текущего проекта?
Является ли вообще разумным повторное использование и/или наследование существующих ошибок, или я должен сохранить собственный собственный пользовательский набор?
Ответы
Ответ 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)
Вы также можете проверить источник, чтобы узнать, как они его обрабатывают.