包含try/catch未捕获Coldfusion异常

包含try/catch未捕获Coldfusion异常,coldfusion,Coldfusion,您可以在未注释第一个或第二个指定代码块的情况下运行,以查看问题 <cffunction name="alpha" returntype="boolean"> <cfargument name="boo" type="boolean" /> <cfreturn arguments.boo /> </cffunction> <cffunction name="beta"> <cfset var temp =

您可以在未注释第一个或第二个指定代码块的情况下运行,以查看问题

<cffunction name="alpha" returntype="boolean">
    <cfargument name="boo" type="boolean" />
    <cfreturn arguments.boo />
</cffunction>

<cffunction name="beta">
    <cfset var temp = {} />
    <cftry>
        <cfset temp.userID = 1 />

        <!--- This way throws an *unhandled* exception --->
        <!--- --->
        <cfif alpha(structAppend({userID = temp.userID}, foo))>
            <cfdump var="It worked" />
        </cfif>


        <!--- This way works as expected --->
        <!--- 
        <cfset temp.args = {userID = temp.userID} />
        <cfif alpha(structAppend(temp.args, foo))>
            <cfdump var="It worked" />
        </cfif>
        --->

        <cfcatch>
            <cfdump var="#cfcatch.message#" />
        </cfcatch>
    </cftry>
</cffunction>

我知道结构文字符号
{}
有时会在我的调试器中显示一般命名的结构,但为什么分配由这种语法创建的内容会使结构创建发生在与未分配时不同的时间

如果我调试,我可以在设置
temp.userID=1
的行上设置一个断点,它会直接跳过它。此外,在try/catch中包含的一行上抛出异常,但它未能捕获它

我知道JavaScript中有“提升”的概念。我只能假设在某些(但不是所有!)情况下,CF正在执行类似于结构文本的操作


这是一个bug,还是CF的已知行为?

看起来更像是一个bug,其上下文用于评估变量,而不是计时。尽管同意structAppend调用应该可以工作(实际上在Lucee中也是如此)。话虽如此,用例是什么?在大多数情况下,您似乎希望将结构分配给单独的变量。否则,在structAppend调用结束后无法访问它。它似乎使用脚本语法工作-(如果我的转换正确的话),这让我相信它确实是一个bug。同意@jinglesthula-FWIW,cftry不能捕获所有错误。这一切都取决于类型(java.lang.exception与java.lang.error)以及它是否可恢复。一般来说,不可恢复的问题只能在OneError、ecetera中发现。@Leigh这是一个有点做作的示例来演示这种行为。我不确定我在现实生活中是否使用过
structAppend
的返回值。我主要是想知道为什么会这样,这样我就可以避免一般情况。@jinglesthula-基本上这听起来像个bug。如果不尝试捕获返回值(cftry也可以工作),那么它似乎工作得很好。IIRC,它是那些总是
true
的无意义返回值之一。所以不能使用这个特殊的表达方式可能不是什么大问题。尽管如此,我还是同意它应该像书面的那样工作。