0

私はcfthrowのドキュメントを読んでいて、これに出くわしました

cfthrowタグを使用する場合

アプリケーションがアプリケーション固有のエラーを識別して処理できる場合は、cfthrowタグを使用します。cfthrowタグの一般的な使用法の1つは、カスタムデータ検証の実装です。cfthrowタグは、カスタムタグページから呼び出し元ページにエラーをスローする場合にも役立ちます。

たとえば、パスワードの設定に使用されるフォームアクションページまたはカスタムタグで、アプリケーションは、入力されたパスワードが最小の長さであるか、文字と数字の両方を含むかを判断し、パスワードルールを示すメッセージでエラーをスローできます。壊れた。cfcatchブロックはエラーを処理し、問題を修正する方法をユーザーに通知します。

私はこれまでずっと間違ったことをしていましたか、それともこれはひどいユースケースですか?

例外は、通常のアプリケーションフローを処理するために使用するのではなく、ある程度制御できないものに使用する必要があると教えられました。たとえば、ファイルに書き込もうとしたときにファイルがロックされているとします。

パスワードルールに違反しているユーザーは、自分で制御できないもののようには聞こえません。

4

2 に答える 2

5

これは悪い例であり、悪いユースケースではありません。私は個人的にパラメーターを検証関数に渡し、合格または不合格を含む結果と、ユーザーに表示する失敗メッセージのコレクションを返します。

例外の使い方は次のとおりです。

関数内。データベースからデータを取得し、そこから構造を構築する関数があるとします。返されたクエリに値がない場合は、いくつかのオプションがあります。-

  1. 空の構造体を返し、呼び出し元のコードに構造体が空であるという事実から問題を推測させることができます。これは理想的ではありません。なぜなら、アプリケーションは欠落データに対処するために複雑なロジックを持たなければならないからです。

  2. より複雑なデータ型を返すことができます。1つのプロパティは、プロセスが正常に行われたかどうかと実際のデータです。繰り返しになりますが、これは最適ではありません。ほとんどの場合、データがあり、アプリケーションがこの問題を処理しているときに、すべての呼び出しでプロパティにアクセスする必要があるためです。

  3. または、一致するレコードがないことを示すcfthrowを使用してカスタム例外を発生させることもできます。これは、このエラーが発生する可能性を無視してonErrorハンドラーにバブルアップさせるか、trycatchステートメントで囲んでそこで処理するかを選択できることを意味します。これにより、APIがクリーンで賢明に保たれます。

外部エラーのラッピングは、https経由でcfhttpを使用して外部APIに接続するとします。これには、キーストアに証明書をインストールする必要があります。そうしないと、エラーがスローされます。この証明書が更新されると、エラーが再び発生します。この例では、呼び出しをtry catchでラップします。これがエラーの場合は、キーストアの証明書を更新して、デバッグする開発者が何をすべきかを知る必要があることを詳細に示すメッセージを使用して、独自のカスタム例外でラップします。それを解決する必要なしにそれを修正するために行います。それがその特定のエラーでない場合、私はそれをcfrethrowして、それがバブルし、呼び出しの上にある例外処理ロジックによって処理されるようにします。

これらはほんの一例ですが、他にもあります。要約すると、例外をスローすることは、API /アプリケーションロジックをクリーンで理解しやすい状態に保ちながら、動作に期待されていない何かが発生したときに、アプリケーションの層を介して通信する方法であると言えます。

于 2012-04-13T14:47:16.543 に答える
1

それは本当にあなたの裁量次第です。多くの言語では、入力検証を含むすべてに例外を使用することが非常に一般的です。

重要なのは、例外はあなたがコントロールできるかどうかとは何の関係もありません。たとえば、ファイルをアップロードするかなり長くて複雑なモジュールがあるとします。そのようなものには多くの失敗点があります:ファイルが大きすぎる、ファイルが間違ったフォーマットである可能性があります。例外なく、あなたの唯一のオプションは多くのif / thenチェックと、最後にある種のステータスリターンです。 。例外を除いて、あなたがしなければならないのは、一連のcfthrowsを使用することだけです。

<cfthrow type="FileUpload.TooBig" message="The file size was #FileSize#, but the maximum size allowed is #MaxFileSize#">

<cfthrow type="FileUpload.WrongType" message="The file type was #FilType#, but the accepted types are #AcceptedTypeList#">

次に、ファイルアップロード関数を呼び出しているものはすべて、特定の関数をキャッチするか<cfcatch type="FileUpload">、特定の関数をキャッチできます(例<cfcatch type="FileUpload.WrongType">)。

また、技術的には、ユーザーがパスワードの値を決定したという意味で、パスワードを破ったユーザーは制御できません。とは言うものの、私はパスワード規則を嫌います。なぜなら、それらは常にセキュリティを維持することを難しくし、容易ではないからです。

于 2012-04-13T13:52:58.527 に答える