21

多くの場合、custom(ized)エラーをスローする必要があります。パラメータの不一致などによりリソースが見つからない場合など。

私は既存のエラーをスローするか、既存のエラーから継承されたエラーをスローすることを好みます。そのため、すでに定義されていて完全に使用できた可能性のあるエラークラス(DRY)は紹介しません。ただし、元のエラーとの違いを明確にするために1つまたは2つの単語を継承して変更するだけで、表現とスタイルを同じに保つこともできます。

例えば:

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

RubyCoreとRubyonRailsで利用可能なエラークラスのリストはありますか?現在のプロジェクトでそのようなリストを取得する方法はありますか?

既存のエラーを再利用および/または継承するのは賢明ですか、それとも代わりに独自のカスタムセットを維持する必要がありますか?

4

3 に答える 3

48

このリストは変更される可能性があり、Ryanのソリューションを引き続き使用するのが最善ですが、Rails 4のリスト(Railsクラスに限定され、他のgemには限定されません):

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
于 2013-10-13T18:31:21.217 に答える
27

ここにほとんど適切な解決策があります:http ://www.ruby-forum.com/topic/158088

この質問には回答がありませんが、Googleの検索結果の上部に表示されるので、FrederickCheungのソリューションをレーキタスクにまとめてここに投稿することにしました。

以下を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。たぶん、他の誰かがその理由について私に教えてくれるでしょう。

于 2012-01-22T14:56:47.390 に答える
8

ActiveSupportのおかげで、Railsではより短いオプションを利用できます。

puts Exception.descendants.sort_by(&:name)

ソースをチェックして、それらがどのように処理するかを確認することもできます。

于 2016-08-23T17:35:34.027 に答える