2011-06-29 16 views
19

A menudo tengo que lanzar un error personalizado (ized). Como cuando no se puede encontrar un recurso debido a una falta de coincidencia en los parámetros más o menos.Obtener una lista de clases de errores de Rails existentes para reutilizar/herencia

Prefiero arrojar errores existentes o, lanzar un error heredado de un error existente. De esta forma, no introduzco las clases de error que ya estaban definidas y que podrían haberse utilizado perfectamente (DRY). Pero también permite mantener la redacción y el estilo de la misma, 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 seguro de este tipo de errores ya están definidos. De hecho, después de leer muchas líneas de código, encontré que mi controlador MongoID tiene Mongoid::Errors::InvalidOptions: Calling Document#find with nil is invalid.

¿Hay una lista de clases de error disponibles en Ruby Core y Ruby on Rails? ¿Hay alguna manera de obtener una lista para su proyecto actual?

¿Es inteligente reutilizar y/o heredar errores existentes, o debería mantener mi propio conjunto personalizado?

Respuesta

23

Hay una solución mayormente adecuada aquí: http://www.ruby-forum.com/topic/158088

Desde esta pregunta se contesta, sin embargo, que viene en la parte superior de los resultados de búsqueda de Google, que decidió solución de envuelta Frederick Cheung en una tarea rastrillo y que lo ponga aquí.

gota en el siguiente lib/tareas/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 

Ejecutar con:

bundle exec rake exceptions:list 

Si todavía está en los carriles 2, o no usando Bündler, dejar 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 iluminarme sobre por qué.

+0

Puede que no sea exhaustivo, pero es suficiente para mí, por ahora. Muchas gracias. Y gracias por el enlace a la lista. – berkes

43

Si bien esta lista puede cambiar, y lo mejor es seguir utilizando la solución de Ryan, la lista de los carriles 4 (limitada a las clases rieles y no 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 
+0

¡Gracias por la lista! – Loed

+0

no ¿Falta la plantilla de ActionView? – Luiz

3

Una opción más corta está disponible en rieles thanks to ActiveSupport :

puts Exception.descendants.sort_by(&:name) 

También puede consultar la fuente para ver cómo lo manejan.

Cuestiones relacionadas