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 
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
Post a Comment