我在<cftry
标记之外有一个<cfmail
。在<cftry
中设置了变量x。变量x不能生存超过</cftry>
。
<cfoutput>
<cftry>
<cfmail
from = "[email protected]"
to = "[email protected]"
password = "something"
username = "[email protected]"
server = "localhost"
replyto = "[email protected]"
subject = "try-catch"
type = "html" >
<cfset x = 'abc'>
this is to test email
</cfmail>
success
<cfcatch>
<cfoutput> email failed </cfoutput>
</cfcatch
</cftry>
<!--- there is no variable x --->
x is #x#
</cfoutput>
我想找到一种方法来提取
<cftry
结束后的x值。我尝试用<cftry
内的不同范围设置它<cfset register.x = 'abc'> or even
<cfset session.x = 'abc'>
但是这些都没有将x保留在
<cftry>
之外。有人可以建议一种将x保留在</cftry>
之外的方法吗? 最佳答案
看起来您对异常处理有误解。 try
中的代码只有在没有例外的情况下才能完全执行。一旦try
中发生异常,执行就会停止并跳转到catch
。
例子1
<cftry>
<cfset x = "everything is ok">
<cfcatch>
<cfset x = "an exception occured">
</cfcatch>
</cftry>
<cfoutput>#x#</cfoutput>
这将始终输出
everything is ok
,因为try
中的代码可以执行而不会引起异常。例子2
<cftry>
<cfthrow message="I fail you!">
<cfset x = "everything is ok">
<cfcatch>
<cfset x = "an exception occured">
</cfcatch>
</cftry>
<cfoutput>#x#</cfoutput>
这将始终输出
an exception occured
,因为try
中的代码仅执行到抛出异常的地步(我们在这里故意使用<cfthrow>
进行此操作)。例子3
<cftry>
<cfset x = "everything is ok">
<cfthrow message="I fail you!">
<cfcatch>
<cfset x = "an exception occured">
</cfcatch>
</cftry>
<cfoutput>#x#</cfoutput>
这仍将输出
an exception occured
。尽管<cfset x = "everything is ok">
语句已正确执行并设置了变量x
,但由于引发异常,我们仍跳至catch
。示例4(这是您的问题!)
<cftry>
<cfthrow message="I fail you!">
<cfset x = "everything is ok">
<cfcatch>
<!--- we are doing nothing --->
</cfcatch>
</cftry>
<cfoutput>#x#</cfoutput>
这将引发运行时错误,告诉您
x
未定义。为什么?因为由于遇到异常,所以从未到达声明x
的语句。而且catch也没有引入变量。长话短说
您的
<cfmail>
导致异常,并且从未达到<cfset x = 'abc'>
。修复
正确的错误处理意味着有意义地处理捕获的异常。请勿
<cfoutput> email failed </cfoutput>
摆脱困境,并表现为自己不在乎。记录异常(该异常为<cflog>
)并对其进行监视。出于调试目的,您可以在<cfrethrow>
中使用<cfcatch>
保留原始异常,而不是静默吸收错误的真正原因。