ruby-on-rails-3 error-handling custom-exceptions

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.