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>