cftry中的coldfusion变量不会持久化
我有一个cftry中的coldfusion变量不会持久化,coldfusion,try-catch,cfml,Coldfusion,Try Catch,Cfml,我有一个看起来你对异常处理有一个误解。只有在没有异常的情况下,try中的代码才会完全执行。一旦在try中发生异常,执行就会停止并跳转到catch 例1 这将始终输出发生异常的,因为try中的代码仅执行到引发异常的点(我们在这里是故意使用) 例3 这将引发运行时错误,告诉您x未定义。为什么?因为声明x的语句由于遇到异常而无法到达。捕获也不会引入变量 长话短说 您的正在导致异常,并且从未到达 修复 正确的错误处理意味着有意义地处理捕获的异常。不要email失败你的方式摆脱它,表现得好像你不在乎。记录
看起来你对异常处理有一个误解。只有在没有异常的情况下,try
中的代码才会完全执行。一旦在try
中发生异常,执行就会停止并跳转到catch
例1
这将始终输出发生异常的
,因为try
中的代码仅执行到引发异常的点(我们在这里是故意使用
)
例3
这将引发运行时错误,告诉您x
未定义。为什么?因为声明x
的语句由于遇到异常而无法到达。捕获也不会引入变量
长话短说
您的
正在导致异常,并且从未到达
修复
正确的错误处理意味着有意义地处理捕获的异常。不要email失败
你的方式摆脱它,表现得好像你不在乎。记录该异常(没有相应的异常)并监视它。出于调试目的,您可以在
中使用来保留原始异常,而不是默默地吸取错误的真正原因。是否显示成功消息?旁注,请确保立即更改密码,因为它已存档。您使用的是什么版本的CF?这表明您的代码在设置x
之前失败,因此不可用。尝试在尝试的顶部设置x
,它可能会起作用(除非你的x
失败)。或者将x
设置在try/catch
块之外。Ageax--thx,我将更改密码。听起来您可能需要提供更多示例代码来查看,以便我们可以解决整个问题。实际上,将cfset x
移动到cfthrow
上方,它将“返回”x
。它似乎不会回滚在try
块中完成的操作。故障发生后,它将只传递到捕捉
。在示例3中,x
在cftry
代码中设置,然后在cfcatch
中覆盖。这就是为什么尽可能保持try/catch
块的最低限度是好的。@CharlesRobertson我也是这么想的。如果您在cftry
中更改某个内容,并认为它是因为cfcatch
中捕获的错误而回滚的,这可能会导致一些意外行为,有点像事务是“应该”执行的。但是,try/catch
并不是真正的事务。这是错误处理。把它归结为“我从来没有想过但很高兴知道的事情。”:-)@CharlesRobertson!您可以测试文件是否存在。访问文件进行读(或写)操作可能会以任何方式失败,因为另一个应用程序具有独占锁。当然,在某些情况下,推荐使用try/catch。当然,您必须注意报告/记录错误,因为如果存在catch子句,CF不会写入exception.log
cfrethrow
在选定的情况下可能是一种解决方案。@Shawn这是正确的。当cftry的使用过于宽松时,它通常会隐藏bug。这就是为什么我只在一两行代码中使用cftry,比如cffile action=write。有时此操作失败,但不是因为代码编写方式中存在错误或错误。我们90%的代码应该公开,以便修复任何bug:)
<cfoutput>
<cftry>
<cfmail
from = "user@example.org"
to = "other@example.org"
password = "something"
username = "user@example.org"
server = "localhost"
replyto = "user@example.org"
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>
<cfset register.x = 'abc'> or even
<cfset session.x = 'abc'>
<cftry>
<cfset x = "everything is ok">
<cfcatch>
<cfset x = "an exception occured">
</cfcatch>
</cftry>
<cfoutput>#x#</cfoutput>
<cftry>
<cfthrow message="I fail you!">
<cfset x = "everything is ok">
<cfcatch>
<cfset x = "an exception occured">
</cfcatch>
</cftry>
<cfoutput>#x#</cfoutput>
<cftry>
<cfset x = "everything is ok">
<cfthrow message="I fail you!">
<cfcatch>
<cfset x = "an exception occured">
</cfcatch>
</cftry>
<cfoutput>#x#</cfoutput>
<cftry>
<cfthrow message="I fail you!">
<cfset x = "everything is ok">
<cfcatch>
<!--- we are doing nothing --->
</cfcatch>
</cftry>
<cfoutput>#x#</cfoutput>