Ошибка при возврате неявной структуры в coldfusion

Основы

Я использую коробку CF10u10 с Apache в качестве веб-сервера на моей локальной машине. Я фанат cfscript и люблю использовать новое неявное объявление struct {} против structNew (), когда это возможно.

Код

Файлы являются одним компонентом и одним CFM.

componentFile.cfc

<cfcomponent output="false">

    <cffunction name="blahExplicit" returntype="Struct">
        <cfset var name = 'ColdFusion'/>
        <cfset var ret = structNew()/>
        <cftry>
                <cfreturn {success: true, data: name}/>
            <cfcatch type="any">
                <cfset ret.success = false />
                <cfset ret.data = cfcatch />
                <cfreturn ret/>
            </cfcatch>
        </cftry>
    </cffunction>

    <cffunction name="blahImplicit" returntype="Struct">
        <cfset var name = 'ColdFusion'/>
        <cftry>
                <cfreturn {success: true, data: name}/>
            <cfcatch type="any">
                <cfreturn {success: false, data: cfcatch.detail}/>
            </cfcatch>
        </cftry>
    </cffunction>

    <cffunction name="script_blahExplicit" returntype="Struct">
        <cfscript>
            var name = 'ColdFusion';
            var ret = structNew();
            try{
                return {success: true, data: name};
            } catch(Any err){
                    ret.success = false;
                    ret.data = err.detail;
                    return ret;
            }
        </cfscript>
    </cffunction>

    <cffunction name="script_blahImplicit" returntype="Struct">
        <cfscript>
            var name = 'ColdFusion';
            try{
            return {success: true, data: name};
            } catch(Any err){
                return {success: false, data: err.detail};
            }
        </cfscript>
    </cffunction>
</cfcomponent>

cfcatchErr.cfm

<cfset cObj = createObject("component","componentFile")/>
<cfdump var="#cObj.blahExplicit()#" label="blah Explicit"/>
<cfdump var="#cObj.script_blahExplicit()#" label="blah Explicit With Script"/>
<cfdump var="#cObj.script_blahImplicit()#" label="blah Implicit With Script"/>
<cfdump var="#cObj.blahImplicit()#" label="blah Implicit"/>

Эта проблема

Синтаксический анализатор выдает ошибку, заявляя, что детализация в cfcatch для метода blahImplicit() не определена. Но это все хорошо для остальных методов

Где, как код в blahExplicit(),script_blahExplicit(), script_blahImplicit() просто отлично работает.

Вопрос

Почему это происходит? Почему CF выдает ошибку даже без запуска кода? Это выдает ошибку при разборе самого времени. Я использовал ACF Builder и обнаружил, что элемент управления скачет, чтобы поймать, как только он достигнет попытки.

Это известная проблема или что-то новое? Почему возврат неявной структуры является проблемой?

СкриншотОшибка с неявной структурой

Трассировки стека

coldfusion.runtime.UndefinedElementException: Element DETAIL is undefined in CFCATCH.
    at coldfusion.runtime.CfJspPage.resolveCanonicalName(CfJspPage.java:1752)
    at coldfusion.runtime.CfJspPage._resolve(CfJspPage.java:1705)
    at coldfusion.runtime.CfJspPage._resolveAndAutoscalarize(CfJspPage.java:1854)
    at coldfusion.runtime.CfJspPage._resolveAndAutoscalarize(CfJspPage.java:1833)
    at cfcomponentFile2ecfc947108420$funcBLAHIMPLICIT.runFunction(C:\ColdFusion10\cfusion\wwwroot\fresh\componentFile.cfc:21)
    at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:472)
    at coldfusion.runtime.UDFMethod$ReturnTypeFilter.invoke(UDFMethod.java:405)
    at coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:368)
    at coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:55)
    at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:321)
    at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:220)
    at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:655)
    at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:444)
    at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:414)
    at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:2432)
    at cf62ecfm1194236173.runPage(C:\ColdFusion10\cfusion\wwwroot\fresh\cfcatchErr.cfm:5)
    at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:244)
    at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:444)
    at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)
    at coldfusion.filter.IpFilter.invoke(IpFilter.java:64)
    at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:449)
    at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)
    at coldfusion.filter.PathFilter.invoke(PathFilter.java:112)
    at coldfusion.filter.LicenseFilter.invoke(LicenseFilter.java:30)
    at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:94)
    at coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter.java:79)
    at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)
    at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
    at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)
    at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
    at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
    at coldfusion.filter.CachingFilter.invoke(CachingFilter.java:62)
    at coldfusion.CfmServlet.service(CfmServlet.java:219)
    at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)
    at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:414)
    at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:204)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

Примечание: мне тоже нравится Railo, но в данном случае давайте поговорим только о CF 10. Я отправил сообщение об ошибке в Adobe.

1 ответ

Решение

Это определенно ошибка в CF, настолько хорошая, что вы зарегистрировали ее как таковую ( 3605215).

Наиболее целесообразный обходной путь, который я мог бы придумать, заключается в использовании промежуточной переменной, например:

<cffunction name="blahImplicit" returntype="Struct">
    <cfset var name = 'ColdFusion'/>
    <cftry>
            <cfreturn {success= true, data= name}>
        <cfcatch type="any">
        <cfset var ret = {success= false, data= cfcatch.detail}><!--- this will prevent the error --->
            <cfreturn ret>
        </cfcatch>
    </cftry>
</cffunction>
Другие вопросы по тегам