0

ロゴをたっぷりアップロードできるフォームがあります。cftry/cfcatchステートメント内のファイル(空のフォームフィールド、間違った拡張子など)を検証しています。

でエラーを見つけたら、次のcftryようにします。

 <cfthrow type="FileNotFound" message="#tx_settings_app_error_create_first#" />

そして私の「cfcatch」の中に

 <cfcatch>
    <cfoutput><script type="text/javascript">window.onload = function(){alert("#cfcatch.message#");window.location.href="hs_apps.cfm"; } </script></cfoutput>
 </cfcatch>

これは正常に機能し、すべてのエラーをキャッチして、何が問題なのかをユーザーに警告します。

ここで、重複するユーザー名をチェックしているデータベース呼び出しで同じハンドラーを使用したいと思いました。まだ同じ:

 <cfquery datasource="#Session.datasource#" name="duplicates">
      SELECT a.app_alias 
      FROM apps AS a
      WHERE a.iln = <cfqueryparam value = "#Session.loginID#" cfsqltype="cf_sql_varchar" maxlength="13"> 
      AND a.app_alias = <cfqueryparam value = "#form.app_basic_alias#" cfsqltype="cf_sql_varchar" maxlength="50">
 </cfquery>
 <cfif duplicates.recordcount GT 0>
      <cfthrow type="FileNotFound" message="#tx_settings_apps_error_dup#" />
 </cfif>

cfcatchも同じです。

でも。これでサーバーエラーページが表示され、アプリケーションからスローされます。

質問:何か
考えがありますが、なぜ私はcftry/cfcatchここで働くのに苦労しているのですか?私は無知です。

ありがとう!

編集
ここに完全なコードがあります

<cfif isDefined("send_basic")>
    <cfset variables.timestamp = now()>
    <cfset variables.orderview = "1">

    <cfif form.send_basic_type EQ "new">
    <cftry> 
        <cfif module_check.recordcount GT 0>
            <cfloop query="module_check">
                <cfif module_check.module_name EQ "preorder">
                    <cfset variables.module_name = module_check.module_name>
                    <cfset variables.b2b_preord_ok = "true">
                </cfif>
            </cfloop>
            <cfif form.app_basic_orderview EQ "preo">
                <cfset variables.orderview = "0">
            </cfif>
        </cfif>

        <!--- PROBLEM HERE: DUPLICATES --->
        <cfquery datasource="#Session.datasource#" name="duplicates">
            SELECT a.app_alias 
                FROM apps AS a
                WHERE a.iln = <cfqueryparam value = "#Session.loginID#" cfsqltype="cf_sql_varchar" maxlength="13"> 
                AND a.app_alias = <cfqueryparam value = "#form.app_basic_alias#" cfsqltype="cf_sql_varchar" maxlength="50">
        </cfquery>
        <cfif duplicates.recordcount GT 0>
            <cfthrow type="FileNotFound" message="#tx_settings_apps_error_dup#" />
        </cfif>

        <!--- IF PASS, CREATE/UPDATE --->
        <cfquery datasource="#Session.datasource#">
            INSERT INTO apps ( ... )
            VALUES( ...  )
        </cfquery>
        <cfset variables.app_action = "Applikation erstellt">

        <!--- success --->
        <cfoutput><script type="text/javascript">window.onload = function(){alert("#tx_settings_app_cfm_create#");}</script></cfoutput>

        <cfcatch>
            <cfoutput><script type="text/javascript">window.onload = function(){alert("#tx_settings_app_err_create#");}</script></cfoutput>
        </cfcatch>
    </cftry>
<cfelse>
    <cftry>

        <!--- UPDATE --->
        <cfquery datasource="#Session.datasource#">
            UPDATE apps
                SET   ... = ...
        </cfquery>
        <cfset variables.app_action = "Applikation aktualisiert">
        <!--- success --->
        <cfoutput><script type="text/javascript">window.onload = function(){alert("#tx_settings_app_cfm_update#");}</script></cfoutput>
        <cfcatch>
            <cfoutput><script type="text/javascript">window.onload = function(){alert("#tx_settings_app_err_update#");}</script></cfoutput>
        </cfcatch>
    </cftry>        
</cfif>

</cfif>

私が受け取ったエラーメッセージ私が指定したメッセージ=

 <cfthrow type="FileNotFound" message="#tx_settings_apps_error_dup#" />

キャッチされた場合、背後のテキストに警告する必要がありますtx_settings_apps_error_dupcfcatch指定したテキストであるをダンプするとcfcatch.message、エラーが正常に検出され、サーバーエラーページとアラートが表示されます。ファイルのアップロードとフォームの送信にまったく同じハンドラーを使用しています。ここで機能しない理由がわかりませんか?

助けてくれてありがとう!

WORKAROUD
いいことに注意してください、しかし十分です:

<cfif dups.recordcount NEQ 0>
    <cfoutput><script type="text/javascript">window.onload = function(){alert("#tx_settings_apps_error_dup#"); location.href = "hs_apps_detail.cfm?create=newApp&id=none";}</script
    </cfoutput>
    <cfabort> 
</cfif>

したがって、重複が見つかった場合は、ユーザーに警告し、まったく同じページをリロードしてcfabort、古いページがそれ以上処理されないようにします。パッチです。

4

1 に答える 1

3

(これを単なるコメントから下に移動しました)

OK、それで、あなたがそれをダンプすることができれば、catchは間違いなく例外をキャッチしているので、try / catchが機能していないということではなく、それは別のものです。処理はcatchブロック後のリクエストが終了するまで続行され、その後、出力バッファがフラッシュalert()されてブラウザに送信されることに注意してください。アラートを出力して処理を続行した後、他のエラーが発生し、サーバーのエラーページが表示されているように思われます。エラーページを一時的に取り除き、CFが発生している実際のエラーに注目することをお勧めします。

注意:を出力した後、catchブロックで処理をすぐに停止する場合はalert()、CFに次のように指示する必要があります<cfabort>。それ以外の場合は、上記のように、そのまま続行します。

サーバーエラーページでキャッチされた例外はまだ例外ログに記録されていると思いますが、間違っている可能性があります。いつでもonError()ハンドラーをに配置Application.cfcし、発生したエラーをログに記録してから、エラーを再スローして、エラーページで引き続き処理することができます。そうすれば、エラーに関する情報を取得できますが、パンターには引き続き適切なエラーページが表示されます。

于 2012-10-02T22:57:03.463 に答える