在 cftry 标签中使用. 这些主要用于在ColdFusion页面中获取和运行异常处理.异常主要指打乱ColdFusion正常运行流程的事件 ,例如错误的数据库操作,没有找到包含文件,开发者所指定的其他事件等.
<cfcatch type = "exception type">Exception processing code here</cfcatch>
|
属性 |
必须/可选 |
默认 |
描述 |
|---|---|---|---|
|
type |
可选 |
Any |
|
你必须在至少一个cfcatch 标签里用代码写上一个cftry block 。把cfcatch 标签放在一个cftry block 的结尾处。ColdFusion 可以在cfcatch 标签出现的地方对它们进行测试。这个标签要求一个结尾标签.
如果type="any",ColdFusion 就会捕捉到任何CFML标签,数据源,或者为在对象的异常。可以用以下的代码捕捉这些异常的类型:
#cfcatch.type#
程序可以用cfthrow 标签来获取开发者自定义的异常. 使用下列type选择来捕捉异常:
custom_type"
这个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>