Les baseserreur lors du retour d'une struct implicite dans coldfusion
Je suis en une boîte CF10u10 avec Apache comme serveur web sur ma machine locale. Je suis fan de cfscript et j'aime utiliser la nouvelle structure implicite {} déclaration Vs structNew() autant que possible.
Le code
fichiers sont un composant et un 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"/>
Le problème
L'analyseur renvoie une erreur indiquant détail est pas défini dans cfcatch pour la blahImplicit() méthode. Mais tout va bien pour les méthodes restantes
Où où le code dans blahExplicit(), script_blahExplicit(), script_blahImplicit() fonctionne bien.
La question
Pourquoi est-ce qui se passe? Pourquoi CF lance-t-il une erreur même sans exécuter le code? Il lance l'erreur au moment même de l'analyse. J'ai utilisé ACF Builder et trouvé que le contrôle saute à attraper dès qu'il atteint essayez.
Est-ce un problème connu ou quelque chose de nouveau? Pourquoi retourner un problème implicite?
ScreenShot
Stack Trace
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)
Remarque: J'aime Railo aussi, mais permet de parler seulement CF 10 dans ce cas. J'ai soumis un bug to Adobe.
Pouvez-vous svp inclure le message d'erreur réelle, plutôt que de simplement décrire. Inclure la partie initiale de la trace de la pile ainsi, pls. –
@AdamCameron fait maître :) – Sanjeev
Les bonnes nouvelles sont que je peux reproduire cela sur CF9, donc peut travailler avec elle. Merci pour le très bon cas de repro, btw. –