cftry中的Coldfusion变量不持久

时间:2019-04-04 19:24:56

标签: coldfusion try-catch cfml

我在<cftry标记之外有一个<cfmail。在<cftry中设置了一个变量x。变量x无法在</cftry>之后生存。

<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>

我想找到某种方法来<cftry结束后提取x的值。我试过在<cftry

内用不同的作用域设置它
<cfset register.x = 'abc'>  or even
<cfset session.x = 'abc'>

但是这些都没有在<cftry>之外保留x。有人可以建议一种将x保留到</cftry>之外的方法吗?

1 个答案:

答案 0 :(得分:11)

您似乎对异常处理有误解。 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>进行此操作)。 / p>

示例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>)并监视它。出于调试目的,您可以在<cfcatch>中使用<cfrethrow>来保留原始异常,而不是默默地吸收错误的真正原因。