• type="any" のときのこのタグの動作が変更されました。type="any" を指定した cfcatch タグを含める場合、ブロック内の最後の cfcatch タグに type="any" を指定して他のすべてのテストがその前に実行されていることを確認する必要はありません。ColdFusion により、一致度が最も高い cfcatch ブロックが検出されます。
  • cfscript タグの動作が変更されました。このタグは、cftry タグおよび cfcatch タグと同じ役割を果たす try ステートメントと catch ステートメントを含みます。
  • オブジェクトの修正について変更がありました。cfcatch によって返されたオブジェクトを修正することはできません。
  • 返される例外が変更されました。cfcollection、cfindex、および cfsearch タグは、SEARCHENGINE 例外を返すことができます。以前のリリースでは、これらのタグの処理時にエラーが起きたときは UNKNOWN 例外のみが返されていました。
  • 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 でアプリケーションを使用すると予期せぬ動作が発生することがあります。

     
    使用方法

    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: すべての例外タイプを検出します。