Adobe ColdFusion 8

cfcatch

描述

cftry 标签中使用. 这些主要用于在ColdFusion页面中获取和运行异常处理.异常主要指打乱ColdFusion正常运行流程的事件 ,例如错误的数据库操作,没有找到包含文件,开发者所指定的其他事件等.

类别

异常控制标签

语法

<cfcatch type = "exception type">
    Exception processing code here
</cfcatch>

 

属性

属性

必须/可选

默认

描述

type

可选

Any

  • application: 捕捉application异常错误
  • database: 获取数据库异常错误
  • template: 获取ColdFusion 页面异常
  • security: 获取安全异常
  • object: 获取对象异常
  • missingInclude: 获取缺失包含文件异常错误
  • expression: 获取表达式异常
  • lock: 获取lock异常
  • custom_type: 获取通过cfthrow 标签所定义的异常
  • searchengine: 获取Verity搜索引擎的异常
  • any: 获取所有情况的异常

用途

你必须在至少一个cfcatch 标签里用代码写上一个cftry block 。把cfcatch 标签放在一个cftry block 的结尾处。ColdFusion 可以在cfcatch 标签出现的地方对它们进行测试。这个标签要求一个结尾标签.

如果type="any",ColdFusion 就会捕捉到任何CFML标签,数据源,或者为在对象的异常。可以用以下的代码捕捉这些异常的类型:

#cfcatch.type#

程序可以用cfthrow 标签来获取开发者自定义的异常. 使用下列type选择来捕捉异常:

  • "custom_type"
  • "Application"
  • "Any"

这个custom_type type 是一个开发者定义在cfthrow 里指定的类型. 如果你定义的类型是一个字符串式的级联 (例如, "MyApp.BusinessRuleException.InvalidAccount"), ColdFusion 可以捕捉到它的最后一个字符参数异常为这个自定义类型 . ColdFusion 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 tags 主要配合用于异常类型是 type = "template".

当使用 cftry 控制的 cfcatch 包含的异常不能被cfcatch马上捕捉到. 这样的话,你可以用 cfrethrow 来重新捕捉到当前状态的异常.

cfcatch 变量提供以下异常信息:

cfcatch 变量 

内容

cfcatch.type

Type: 异常类型, 在 cfcatch 中被指定.

cfcatch.message

Message: 异常诊断信息, 如果没有被提供, 则为空 .

cfcatch.detail

在CFML 编译器中或在 cfthrow 标签中的异常明细信息 . 当异常被 ColdFusion 所产生(并非 cfthrow), 该消息可以包含HTML格式的信息并能帮助判断是由哪个tag触发的异常.

cfcatch.tagcontext

一个标签内的数组结构, 每个都代表该活动标签在当前异常时刻的级别.

cfcatch.NativeErrorCode

应用于 type = "database". 本机的错误代码和异常有关。数据库引擎特别地提供了错误代码用来诊断错误的数据库运作。默认值是-1.

cfcatch.SQLState

应用于 type = "database". 相关于异常的SQLState。数据库引擎特别提供了错误代码用来诊断错误的数据库运行。Defaultvalue是-1.

cfcatch.Sql

应用于 type = "database". 从数据源发出的sql语句.

cfcatch.queryError

应用于 type ="database".由数据库驱动报告的记录集信息.

cfcatch.where

应用于 type = "database". 如果query中使用了 cfqueryparam 标签, query 参数的 name-value 对.

cfcatch.ErrNumber

应用于 type = "expression". 总体异常错误数.

cfcatch.MissingFileName

应用于 type = "missingInclude". 未被包含的文件名.

cfcatch.LockName

应用于 type = "lock". 作用域锁定的名称.

cfcatch.LockOperation

应用于 type = "lock". 操作作用域失败 (超时, 创建重复, 或是未知情况).

cfcatch.ErrorCode

应用于 type = "custom". 字符串错误代码.

cfcatch.ExtendedInfo

应用于 type = "application""custom". 自定义错误信息; 当默认异常没有正常显示信息.

高级异常类型

你还可以在type属性中指定以下高级异常类型:

ColdFusion advanced exception type

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

范例

<!--- The cfcatch example that uses TagContext to display the tag stack. --->
<h3>cftry Example</h3>
<!--- Open a cftry block. --->
<cftry>
    <!--- Notice misspelled tablename "employees" as "employeeas". --->
    <cfquery name = "TestQuery" dataSource = "cfdocexamples">
        SELECT *
        FROM employees
    </cfquery>
    <!--- Other processing goes here. --->
    <!--- Specify the type of error for which we search. --->
    <cfcatch type = "Database">
        <!--- The message to display. --->
        <h3>You've Thrown a Database <b>Error</b></h3>
        <cfoutput>
            <!--- The diagnostic message from ColdFusion. --->
            <p>#cfcatch.message#</p>
            <p>Caught an exception, type = #CFCATCH.TYPE#</p>
            <p>The contents of the tag stack are:</p>
            <cfdump var="#cfcatch.tagcontext#">
        </cfoutput>
    </cfcatch>
</cftry>