2011-06-29 6 views
19

多くの場合、カスタム(サイズ)エラーをスローする必要があります。パラメータなどの不一致によりリソースが見つからない場合と同様です。再利用/継承のための既存のRailsエラークラスのリストを取得する

私は、既存のエラーを投げたり、既存のエラーから継承されたエラーをスローすることを好みます。そのようにして、私はすでに定義されていて、完全に(DRY)使用されている可能性のあるErrorクラスを導入しません。しかし、元のエラーとの違いを明確にするために、継承して単純に言葉を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であることを発見しました。

のRuby on RailsのコアとRubyで利用可能なエラー・クラスのリストはありますか?あなたの現在のプロジェクトにそのようなリストを取得する方法はありますか?

はを再利用および/または既存のエラーを継承するすべてで、それはスマートです、または私は自分自身を維持する必要があり、カスタムの代わりに設定されていますか?

答えて

23

あり、主に適切な解決策はここにある:この質問は未回答なのでhttp://www.ruby-forum.com/topic/158088

、まだGoogleの検索結果の一番上に来る、私は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 

のlib /タスク/ exceptions.rakeでそれを次

bundle exec rake exceptions:list 

あなたがRailsの2に残っている場合、またはバンドラーを使用していません、 bundle exec

このリストは、おそらく適切ですが、網羅的ではありません。たとえば、ActiveResourceでは、ActiveResource::ConnectionErrorActiveResource::TimeoutErrorなど、このタスクを実行すると表示されない例外がいくつか定義されています。たぶん誰かがなぜ私を啓発することができますか?

+0

これは網羅的ではないかもしれませんが、私にとっては今のところ十分です。どうもありがとう。リストにリンクしてくれてありがとう。 – berkes

43

このリストは変更されることがありますが、それはまだライアンのソリューション、レール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 
+0

リストありがとうございます! – Loed

+0

ActionViewにテンプレートがありませんか? – Luiz

3

短いオプションは、Railsのthanks to ActiveSupportで提供されています:

puts Exception.descendants.sort_by(&:name) 

ソースをチェックアウトして、その処理方法を確認することもできます。

関連する問題