CFCATCH |
説明 cftry タグの内部で使用します。これらを併用することで、ColdFusion ページで発生する例外の検出や処理を実行します。例外は、データベースオペレーションの失敗、インクルードファイルの欠如、開発者によって指定されたイベントなど、ColdFusion ページ内での正常な命令の流れを妨げるイベントです。
カテゴリ 例外処理タグ
シンタックス
    <cfcatch type = "exceptiontype">
       ここに例外処理コードを追加します。
    </cfcatch>
関連項目 cftry、cferror、cfrethrow、cfthrow、onError、『ColdFusion MX 開発ガイド』の第14章の「エラーの処理」
ヒストリ ColdFusion MX: SQLSTATE 値の動作が変更されました。cfcatch タグ内の SQLSTATE 戻り値は、データベースドライバのタイプによって異なります。 Type 1 (JDBC-ODBC ブリッジ) の場合、値は ColdFusion 5 での値と同じになります。 Type 4 (100% Java、ネイティブメソッドなし) の場合、値は異なる可能性があります。 アプリケーションのフロー制御が SQLSTATE 値に依存している場合は、ColdFusion MX でアプリケーションを使用すると予期せぬ動作が発生することがあります。
- type="any" のときのこのタグの動作が変更されました。type="any" を指定した cfcatch タグを含める場合、ブロック内の最後の cfcatch タグに type="any" を指定して他のすべてのテストがその前に実行されていることを確認する必要はありません。ColdFusion により、一致度が最も高い cfcatch ブロックが検出されます。
- cfscript タグの動作が変更されました。このタグは、cftry タグおよび cfcatch タグと同じ役割を果たす try ステートメントと catch ステートメントを含みます。
- オブジェクトの修正について変更がありました。cfcatch によって返されたオブジェクトを修正することはできません。
- 返される例外が変更されました。cfcollection、cfindex、および cfsearch タグは、SEARCHENGINE 例外を返すことができます。以前のリリースでは、これらのタグの処理時にエラーが起きたときは UNKNOWN 例外のみが返されていました。

使用方法 cftry ブロック内に少なくとも 1 つの cfcatch タグを記述する必要があります。cfcatch タグは cftry ブロックの最後に配置します。複数の cfcatch タグがある場合、ColdFusion MX はそれらを出現順にテストします。このタグには終了タグが必要です。 type="any" が指定されている場合、ColdFusion MX は CFML タグ、データソース、または外部オブジェクトからの例外を検出します。例外タイプを取得するには、次のようなコードを使用します。
       #cfcatch.type#
アプリケーションで cfthrow タグを使用して、開発者定義の例外を返すことができます。これらの例外は、次の type オプションのいずれかによって検出できます。 "custom_type" "Application" "Any" custom_type タイプは、cfthrow タグで指定される開発者定義のタイプです。カスタムタイプをピリオドで連結された一連の文字列として定義した場合 ("MyApp.BusinessRuleException.InvalidAccount" など)、ColdFusion MX はその文字パターンに基づいてカスタムタイプを検出できます。ColdFusion MX は、cftry ブロック内で、一致する例外タイプの cfcatch タグを探します。このとき、最も条件の厳しいもの (全文字列が一致するもの) から条件の緩いものへという順序で検索が行われます。 たとえば、次のようなタイプを定義したとします。
    <cfthrow type = "MyApp.BusinessRuleException.InvalidAccount">
このとき、次のような cfcatch タグがある場合は、このタグが例外を処理します。
    <cfcatch type = "MyApp.BusinessRuleException.InvalidAccount">
上記のタグがない場合、次のような cfcatch タグがあれば、このタグが例外を処理します。
    <cfcatch type = "MyApp.BusinessRuleException">
このタグもない場合、次のような cfcatch タグがあれば、このタグが例外を処理します。
    <cfcatch type = "MyApp">
カスタム例外タイプを検出するために、cfcatch タグを任意の順序でコーディングすることができます。 type = "Application" を指定した cfcatch タグは、カスタム例外を定義する cfthrow タグ内で Application タイプが指定されているカスタム例外のみを検出します。 cfinclude タグ、cfmodule タグ、および cferror タグは、type = "template" の例外を返します。 cfcatch ブロック内で発生した例外を、その cfcatch タグを直接囲んでいる cftry ブロックで処理することはできません。ただし、cfrethrow タグを使用して現在アクティブな例外を再び返すことができます。 cfcatch タグの変数では、次の例外情報を提供できます。
cfcatch 変数 | 内容
--- | ---
    cfcatch.type
| タイプ : cfcatch で指定した例外タイプです。
    cfcatch.message
| メッセージ : cfcatch.message 変数内に設定される場合は、例外の診断メッセージです。それ以外の場合は、空の文字列となります。
    cfcatch.detail
| CFML インタープリタからの詳細メッセージ、または cfthrow タグ内で指定されたメッセージです。cfthrow ではなく ColdFusion によって 例外が生成されたときは、メッセージに HTML 形式を含めることができます。このメッセージは、どのタグが例外を返したのかを判別するのに役立ちます。
    cfcatch.tagcontext
| タグコンテキスト構造の配列です。それぞれは、例外発生時のアクティブなタグコンテキストのレベルを表します。
    cfcatch.NativeErrorCode
| type = "database" に適用されます。例外に割り当てられるネイティブエラーコードです。通常、データベースドライバから、データベースオペレーションの失敗を診断するためのエラーコードが与えられます。デフォルト : -1
    cfcatch.SQLState
| type = "database" に適用されます。例外に割り当てられる SQLState 値です。通常、データベースドライバから、データベースオペレーションの失敗を診断するためのエラーコードが与えられます。デフォルト : -1
    cfcatch.Sql
| type = "database" に適用されます。データソースに送信される SQL ステートメントです。
    cfcatch.queryError
| type = "database" に適用されます。データベースドライバによってレポートされたエラーメッセージです。
    cfcatch.where
| type = "database" に適用されます。クエリーで cfqueryparam タグを使用する場合は、クエリーパラメータの名前/値のペアです。
    cfcatch.ErrNumber
| type = "expression" に適用されます。内部式のエラー番号です。
    cfcatch.MissingFileName
| type = "missingInclude" に適用されます。インクルードできなかったファイルの名前です。
    cfcatch.LockName
| type = "lock" に適用されます。影響を受けたロックの名前です。ロックに名前が付けられていない場合、値は "anonymous" になります。
    cfcatch.LockOperation
| type = "lock" に適用されます。エラーとなったオペレーションです (Timeout、Create Mutex、または Unknown)。
    cfcatch.ErrorCode
| type = "custom" に適用されます。文字列エラーコードです。
    cfcatch.ExtendedInfo
| type = "application" および "custom" に適用されます。カスタムエラーメッセージです。デフォルトの例外ハンドラでは表示できない情報です。
拡張例外タイプ 次の表に、type 属性で指定できる拡張例外タイプの一覧を示します。
ColdFusion の拡張例外タイプ
COM.Allaire.ColdFusion.CFEXECUTE.OutputError
COM.Allaire.ColdFusion.CFEXECUTE.Timeout
COM.Allaire.ColdFusion.FileException
COM.Allaire.ColdFusion.HTTPAccepted
COM.Allaire.ColdFusion.HTTPAuthFailure
COM.Allaire.ColdFusion.HTTPBadGateway
COM.Allaire.ColdFusion.HTTPBadRequest
COM.Allaire.ColdFusion.HTTPCFHTTPRequestEntityTooLarge
COM.Allaire.ColdFusion.HTTPCGIValueNotPassed
COM.Allaire.ColdFusion.HTTPConflict
COM.Allaire.ColdFusion.HTTPContentLengthRequired
COM.Allaire.ColdFusion.HTTPContinue
COM.Allaire.ColdFusion.HTTPCookieValueNotPassed
COM.Allaire.ColdFusion.HTTPCreated
COM.Allaire.ColdFusion.HTTPFailure
COM.Allaire.ColdFusion.HTTPFileInvalidPath
COM.Allaire.ColdFusion.HTTPFileNotFound
COM.Allaire.ColdFusion.HTTPFileNotPassed
COM.Allaire.ColdFusion.HTTPFileNotRenderable
COM.Allaire.ColdFusion.HTTPForbidden
COM.Allaire.ColdFusion.HTTPGatewayTimeout
COM.Allaire.ColdFusion.HTTPGone
COM.Allaire.ColdFusion.HTTPMethodNotAllowed
COM.Allaire.ColdFusion.HTTPMovedPermanently
COM.Allaire.ColdFusion.HTTPMovedTemporarily
COM.Allaire.ColdFusion.HTTPMultipleChoices
COM.Allaire.ColdFusion.HTTPNoContent
COM.Allaire.ColdFusion.HTTPNonAuthoritativeInfo
COM.Allaire.ColdFusion.HTTPNotAcceptable
COM.Allaire.ColdFusion.HTTPNotFound
COM.Allaire.ColdFusion.HTTPNotImplemented
COM.Allaire.ColdFusion.HTTPNotModified
COM.Allaire.ColdFusion.HTTPPartialContent
COM.Allaire.ColdFusion.HTTPPaymentRequired
COM.Allaire.ColdFusion.HTTPPreconditionFailed
COM.Allaire.ColdFusion.HTTPProxyAuthenticationRequired
COM.Allaire.ColdFusion.HTTPRequestURITooLarge
COM.Allaire.ColdFusion.HTTPResetContent
COM.Allaire.ColdFusion.HTTPSeeOther
COM.Allaire.ColdFusion.HTTPServerError
COM.Allaire.ColdFusion.HTTPServiceUnavailable
COM.Allaire.ColdFusion.HTTPSwitchingProtocols
COM.Allaire.ColdFusion.HTTPUnsupportedMediaType
COM.Allaire.ColdFusion.HTTPUrlValueNotPassed
COM.Allaire.ColdFusion.HTTPUseProxy
COM.Allaire.ColdFusion.HTTPVersionNotSupported
COM.Allaire.ColdFusion.POPAuthFailure
COM.Allaire.ColdFusion.POPConnectionFailure
COM.Allaire.ColdFusion.POPDeleteError
COM.Allaire.ColdFusion.Request.Timeout
COM.Allaire.ColdFusion.SERVLETJRunError
COMCOM.Allaire.ColdFusion.HTTPConnectionTimeout
例
    <!--- TagContext を使用してタグスタックを表示する cfcatch の例 --->
    <h3>cftry の例</h3>
    <!--- cftry ブロックを開きます。 --->
    <cftry>
       <!--- テーブル名 "employees" のスペルが誤って "employeeas" になっています。 --->
       <cfquery name = "TestQuery" dataSource = "cfdocexamples">
          SELECT *
          FROM EMPLOYEEAS
       </cfquery>
       <!--- 他の処理がここで行われます。 --->
       <!--- 検出するエラーのタイプを指定します。 --->
       <cfcatch type = "Database">
          <!--- 表示するメッセージです。 --->
          <h3>データベース<b>エラー</b><が発生しました。/h3>
          <cfoutput>
             <!--- ColdFusion MX からの診断メッセージです。 --->
             <p>#cfcatch.message#</p>
             <p>例外エラー、type = #CFCATCH.TYPE# を検出しました。 </p>
             <p>タグスタックの内容は次のとおりです。</p>
             <cfdump var="#cfcatch.tagcontext#">
          </cfoutput>
       </cfcatch>
    </cftry>

TYPE |
| オプション
Default value: "any" application: アプリケーション例外を検出します。 database: データベース例外を検出します。 template: ColdFusion ページ例外を検出します。 security: セキュリティの例外を検出します。 object: オブジェクトの例外を検出します。 missingInclude: インクルードファイル欠如の例外を検出します。 expression: 式の例外を検出します。 lock: ロックの例外を検出します。 custom_type: cfthrow タグで定義された特定のカスタム例外タイプを検出します。 searchengine: Verity サーチエンジンの例外を検出します。 any: すべての例外タイプを検出します。