1

ユーザーがファイルをアップロードできるシステムがあり、そのファイルをループしてから別のファイルを作成します。ファイルをアップロードするユーザーは、ログインしているユーザーです。

問題は、ファイルに機密データが含まれているため、それらを削除する必要があることです。ご想像のとおり、ファイルに詳細情報を書き込み、ファイルを読み取る場所がいくつかあります。このページでエラーが発生することがあります (通常は CFFILE に関するものです)。

だから私の質問は、すべてのコード (とにかくそのほとんど) を巨大な CFTRY に配置しても問題ないですか? 次に、発生した例外をキャッチし、CFCATCH 内で別の CFTRY を実行して 2 つのファイルを削除しますか? (アップデートを読む) このプロセスは 1 日に 100 万回、おそらく 1 か月に 3 回行われるわけではないので、パフォーマンスについてはあまり心配していません。

ファイルが確実に削除されるようにするために、この慣行は受け入れられますか?

更新CFCATCH 内のファイルを削除するつもりはありません。が存在するかどうかをまず確認します。次に、それらを削除します。

4

4 に答える 4

3

巨大な try/catch ブロックについて私が言える唯一のことは、try ブロック内のすべての処理を停止するということです。したがって、まだ実行できることがある場合、線路に 1/4 があるという理由だけで列車全体を停止するのはやり過ぎかもしれません。 .

一連のファイルで動作する同様のプロセスがあります。各プロセスを別々の try / catch ブロックに入れて、互いに干渉しないようにします。つまり、最初のファイルが壊れても、次の 3 つの完全に正常なファイルが台無しになることはありません。catch ブロックは単純にエラー メッセージを文字列に追加し、ユーザーに、ファイルの形式が正しくないことを通知しますが、正常なファイルは期待どおりに処理されます。

<!--- file one --->
<cftry>
  some stuff
  <cfcatch>
    <cfset errors = errors & "file one did not work because #cfcatch.message#">
  </cfcatch>
</cftry>

<!--- file 2 --->
<cftry>
  some stuff
  <cfcatch>
    <cfset errors = errors & "file two did not work because #cfcatch.message#">
  </cfcatch>
</cftry> 
<cfetc...>

動的セットをループしている場合は、try/catch ブロックをループの内側に配置して、try/catch がループを停止せず、他の処理を実行できるようにすることができます。もちろん、ファイル 2 がファイル 1 に依存している場合、これは機能しません...

<cfloop index = "i" ...>
  <cftry>
    some stuff
    <cfcatch>
      <cfset errors = errors & "file #i# did not work because #cfcatch.message#">
    </cfcatch>
  </cftry>
</cfloop>
于 2013-01-25T15:36:57.453 に答える
3

正当な理由がある場合はいつでも、try/catch を使用しても問題ありません。許可されている 100 行のコードではなく、約 101 行のコードに try/catch を配置すれば、真夜中にやって来て引きずり出すような CFML 警察はいません。

ただし、@Tomalakが言うように、あなたの言い回しは、コードが何らかのリファクタリングに耐えられることを示唆しています。あなたはコードをリファクタリングできないと言っていますが、例外処理を追加することはすでにリファクタリングされているので、明らかにそれを行うことができます。だからきちんとやってください。機能のビットを分離し、それらを個別のモジュールに入れます (私は によって呼び出されるようにという意味ではなく<cfmodule>、一般的な用語を意味します)、それらが UDF であろうと、1 つまたは複数の CFC のメソッドであろうと (それらはおそらくばらばらなので、おそらく適切ではありません)単一の CFC の場合)、または単にファイルを含めることさえできます。それらは、後でより適切にリファクタリングできます。開発は反復的で周期的です。覚えておいてください:完璧である必要はありません変更を加えるたびに。一つには、要件が変わると「完璧」の定義が変わります。ただし、コードを保守するときは、常にコードを改善することを目指す必要があります。そして、「このコードは制御不能です」のように、単に 1 つの try/catch を全体に平手打ちすることが改善を示唆するとは思いません。

私が提案できるもう 1 つのことは、改善を行い、おそらくhttps://codereview.stackexchange.com/に投稿して、他の人の考えを調べることです。そのサイトに何人の CFer が住んでいるかはわからないので、Twitter に #ColdFusion のマークを付けて投稿するとよいかもしれません。

于 2013-01-25T08:18:25.280 に答える
1

ファイルに関しても同様の状況があり、別のアプローチをとっています。

ステップ 1 は、ファイルを含むディレクトリへのアクセスを制限することです。

ステップ 2 はスケジュールされたクリーンアップです。毎日実行される ColdFusion ジョブがあります。さまざまなディレクトリを検査し、x 日以上経過したファイルを削除します。x の値はディレクトリによって異なります。

このアプローチは、状況に合う場合と合わない場合があります。

于 2013-01-25T13:33:07.127 に答える
0

私が求めたものとほとんど同じことをするコードの新しいセクションを書かなければなりませんでした。個々の行をファイルに書き込み、その周りに大きな CFTRY をラップする代わりに。代わりに、各行を変数に書き込み、各行を改行文字で終了しました。私の場合 (Windows) の場合、改行文字はChr(13) & Chr(10). ただし、次のコード行を使用する必要があります

<cfset NL = CreateObject("java", "java.lang.System").getProperty("line.separator")>

これにより、変数NLが現在のシステムの改行文字と等しくなります。

次に、変数全体をファイルに書き込むことができる小さな CFTRY を作成できます。

于 2013-02-01T07:26:10.063 に答える