cftry中的coldfusion变量不会持久存在

问题描述 投票:4回答:1

我在<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'>

但是这些都没有保留在<cftry>之外的x。有人可以建议一种方法来保持x超出</cftry>

coldfusion try-catch cfml
1个回答
11
投票

看起来你对异常处理有误解。 try中的代码只有在没有例外的情况下才能完全执行。一旦在try内发生异常,执行就会停止并跳转到catch

Example 1

<cftry>

    <cfset x = "everything is ok">

    <cfcatch>
        <cfset x = "an exception occured">
    </cfcatch>
</cftry>

<cfoutput>#x#</cfoutput>

这将始终输出everything is ok,因为try中的代码可以在不引起异常的情况下执行。

Example 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>进行此操作)。

Example 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

Example 4 (this is your issue!)

<cftry>

    <cfthrow message="I fail you!">

    <cfset x = "everything is ok">

    <cfcatch>
        <!--- we are doing nothing --->
    </cfcatch>
</cftry>

<cfoutput>#x#</cfoutput>

这将抛出运行时错误,告诉您x未定义。为什么?因为遇到异常而从未达到声明x的声明。捕获也不会引入变量。

Long story short

你的<cfmail>造成了一个例外,从未达到<cfset x = 'abc'>

The Fix

正确的错误处理意味着有意义地处理捕获的异常。不要让<cfoutput> email failed </cfoutput>摆脱它,并表现得像你不在乎。记录异常(有<cflog>)并监视它。出于调试目的,您可以在<cfrethrow>中使用<cfcatch>来保留原始异常,而不是默默地吸收错误的真正原因。

© www.soinside.com 2019 - 2024. All rights reserved.