2

!Railsの一部のメソッドは、無効な場合に演算子を使用して例外を発生させることに気づきました。例えば、User.create!

なぜ、いつこのようなものを使いたいのですか?

ありがとう。

4

2 に答える 2

6

さまざまな理由で例外が必要になる可能性があります

  • メソッドが成功することを確認したいかもしれませんが、ここでは実際のエラー処理を行いたくありません。しかし、何かが失敗した場合、リクエストが爆発する (HTTP 500 を生成するなど) ことは問題ないかもしれません。
  • たとえば、呼び出しチェーンのどこかでエラー処理が必要になる場合があります。一般に、エラー処理に向けて長い道のりでエラー状態をプルするのは、はるかに冗長で厄介です。構造化されたエラー処理、つまり、begin ... rescue ... endそれをより明確にします。
  • 例外には、追加のデータを添付できます (エラー メッセージなど)。
  • エラーの種類が異なる場合は、(C でよくあるように) いくつかのマジック id 値ではなく、異なる例外クラスでそれらを表す方が明確なことがよくあります。

エラー状態の数が少なく、呼び出しの直後に完全に処理される場合は、例外ではなくステータス フラグを使用する十分な理由があります。しかし、すべてのテクニックにはその場所と時間があります。

ところで、saveメソッドは内部的に を呼び出しsave!、潜在的な例外を処理し、存在する場合は false を返します。実装のコードを参照してください。

于 2012-05-01T21:43:44.823 に答える
4

トランザクションがアクティブなときに例外がスローされると、ActiveRecord はトランザクションをロールバックします。

したがって、例外をスローするメソッドは、例外的な状況が発生したときにデータベースがトランザクションをコミットしないようにするのに適しています。自分で問題を「処理」できる場合、または実際に問題がない場合は、 を使用せずにバリアントを使用し、!エラー状態の戻り値をチェックして、自分で処理できます。

次のような特定の場合User.create:

  • このUser.createメソッドを使用して、ユーザーが指定したユーザー名がまだ選択されていないかどうかを判断し、別の名前が既に使用されている場合は、ユーザーが別の名前を選択するように求めるプロンプトを表示できます。
  • User.create!最終的に要求を送信するときにこのメソッドを使用すると、ユーザーがフレンドリ名チェックをバイパスしようとした場合に、整合性チェックでトランザクションの作成とロールバックが失敗する可能性があります。
于 2012-05-01T21:37:13.033 に答える