ruby on rails 3 - Obtención de una lista de clases de Error de Rails existentes para reutilización/herencia
ruby-on-rails-3 error-handling (3)
Aquí hay una solución principalmente adecuada: http://www.ruby-forum.com/topic/158088
Debido a que esta pregunta no tiene respuesta, aunque se encuentra en la parte superior de los resultados de búsqueda de Google, decidí envolver la solución de Frederick Cheung en una tarea de rake y publicarla aquí.
Suelte lo siguiente en 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
Ejecutarlo con:
bundle exec rake exceptions:list
Si aún está en Rails 2, o no está utilizando Bundler, deje de lado el bundle exec
Esta lista es probablemente adecuada, pero no exhaustiva. Por ejemplo, ActiveResource define varias excepciones, como ActiveResource::ConnectionError
y ActiveResource::TimeoutError
que no aparecen cuando ejecuto esta tarea. Tal vez alguien más pueda aclararme por qué.
A menudo necesito lanzar un error personalizado (ized). Como cuando no se puede encontrar un recurso debido a una falta de coincidencia en los parámetros o menos.
Prefiero lanzar errores existentes o lanzar un error que se hereda de un error existente. De esa manera, no introduzco clases de error que ya estaban definidas y podrían haber sido utilizadas perfectamente (DRY). Pero también permite mantener la misma redacción y estilo, al heredar y simplemente cambiar una o dos palabras para aclarar la diferencia con el error original.
Por ejemplo:
Foo.new
Foo.some_external_id = nil
Foo.fetch_external_resource
# => InvalidOptions: Calling Foo#fetch_external_resource with nil is invalid
Estoy bastante seguro de que tales errores ya están definidos. De hecho, después de leer muchas líneas de código, encontré que mi controlador Mongoid::Errors::InvalidOptions: Calling Document#find with nil is invalid
tiene Mongoid::Errors::InvalidOptions: Calling Document#find with nil is invalid
.
¿Hay una lista de clases de errores disponibles en Ruby Core y Ruby on Rails? ¿Hay alguna manera de obtener dicha lista para su proyecto actual?
¿Es inteligente en absoluto reutilizar y / o heredar los errores existentes, o debo mantener mi propio conjunto personalizado en su lugar?
Si bien esta lista puede cambiar, y es mejor seguir usando la solución de Ryan, la lista para Rails 4 (limitada a las clases de Rails y no a otras gemas):
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
Una opción más corta está disponible en Rails gracias a ActiveSupport :
puts Exception.descendants.sort_by(&:name)
También puede consultar la fuente para ver cómo la manejan.