error when returning an implicit struct in coldfusion -


the basics

i'm running cf10u10 box apache web server on local machine. i'm fan of cfscript , use new implicit struct {} declaration vs structnew() whenever possible.

the code

files 1 component , 1 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 script"/> <cfdump var="#cobj.script_blahimplicit()#" label="blah implicit script"/> <cfdump var="#cobj.blahimplicit()#" label="blah implicit"/> 

the problem

the parser throws error stating detail undefined in cfcatch blahimplicit() method. okay remaining methods

where as code in blahexplicit(),script_blahexplicit(),script_blahimplicit() works fine.

the question

why happening? why cf throwing error without running code? throwing error @ parse time itself. used acf builder , found control jumps catch reaches try.

is known issue or new? why returning implicit struct problem?

screenshot error implicit struct

stack trace

coldfusion.runtime.undefinedelementexception: element detail undefined in cfcatch.     @ coldfusion.runtime.cfjsppage.resolvecanonicalname(cfjsppage.java:1752)     @ coldfusion.runtime.cfjsppage._resolve(cfjsppage.java:1705)     @ coldfusion.runtime.cfjsppage._resolveandautoscalarize(cfjsppage.java:1854)     @ coldfusion.runtime.cfjsppage._resolveandautoscalarize(cfjsppage.java:1833)     @ cfcomponentfile2ecfc947108420$funcblahimplicit.runfunction(c:\coldfusion10\cfusion\wwwroot\fresh\componentfile.cfc:21)     @ coldfusion.runtime.udfmethod.invoke(udfmethod.java:472)     @ coldfusion.runtime.udfmethod$returntypefilter.invoke(udfmethod.java:405)     @ coldfusion.runtime.udfmethod$argumentcollectionfilter.invoke(udfmethod.java:368)     @ coldfusion.filter.functionaccessfilter.invoke(functionaccessfilter.java:55)     @ coldfusion.runtime.udfmethod.runfilterchain(udfmethod.java:321)     @ coldfusion.runtime.udfmethod.invoke(udfmethod.java:220)     @ coldfusion.runtime.templateproxy.invoke(templateproxy.java:655)     @ coldfusion.runtime.templateproxy.invoke(templateproxy.java:444)     @ coldfusion.runtime.templateproxy.invoke(templateproxy.java:414)     @ coldfusion.runtime.cfjsppage._invoke(cfjsppage.java:2432)     @ cf62ecfm1194236173.runpage(c:\coldfusion10\cfusion\wwwroot\fresh\cfcatcherr.cfm:5)     @ coldfusion.runtime.cfjsppage.invoke(cfjsppage.java:244)     @ coldfusion.tagext.lang.includetag.dostarttag(includetag.java:444)     @ coldfusion.filter.cfincludefilter.invoke(cfincludefilter.java:65)     @ coldfusion.filter.ipfilter.invoke(ipfilter.java:64)     @ coldfusion.filter.applicationfilter.invoke(applicationfilter.java:449)     @ coldfusion.filter.monitoringfilter.invoke(monitoringfilter.java:40)     @ coldfusion.filter.pathfilter.invoke(pathfilter.java:112)     @ coldfusion.filter.licensefilter.invoke(licensefilter.java:30)     @ coldfusion.filter.exceptionfilter.invoke(exceptionfilter.java:94)     @ coldfusion.filter.browserdebugfilter.invoke(browserdebugfilter.java:79)     @ coldfusion.filter.clientscopepersistencefilter.invoke(clientscopepersistencefilter.java:28)     @ coldfusion.filter.browserfilter.invoke(browserfilter.java:38)     @ coldfusion.filter.nocachefilter.invoke(nocachefilter.java:46)     @ coldfusion.filter.globalsfilter.invoke(globalsfilter.java:38)     @ coldfusion.filter.datasourcefilter.invoke(datasourcefilter.java:22)     @ coldfusion.filter.cachingfilter.invoke(cachingfilter.java:62)     @ coldfusion.cfmservlet.service(cfmservlet.java:219)     @ coldfusion.bootstrap.bootstrapservlet.service(bootstrapservlet.java:89)     @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:305)     @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210)     @ coldfusion.monitor.event.monitoringservletfilter.dofilter(monitoringservletfilter.java:42)     @ coldfusion.bootstrap.bootstrapfilter.dofilter(bootstrapfilter.java:46)     @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:243)     @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210)     @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:224)     @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:169)     @ org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:472)     @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:168)     @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:98)     @ org.apache.catalina.valves.accesslogvalve.invoke(accesslogvalve.java:928)     @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:118)     @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:414)     @ org.apache.coyote.ajp.ajpprocessor.process(ajpprocessor.java:204)     @ org.apache.coyote.abstractprotocol$abstractconnectionhandler.process(abstractprotocol.java:539)     @ org.apache.tomcat.util.net.jioendpoint$socketprocessor.run(jioendpoint.java:298)     @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1145)     @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:615)     @ java.lang.thread.run(thread.java:722) 

note: railo too, lets talk cf 10 in case. submitted bug adobe.

it bug in cf, logged such (3605215).

the expedient work-around come use intermediary variable, eg:

<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}><!--- prevent error --->             <cfreturn ret>         </cfcatch>     </cftry> </cffunction> 

Comments

Popular posts from this blog

basic authentication with http post params android -

vb.net - Virtual Keyboard commands -

How to get multiresult with multicondition in Sql Server -