Exception in remote function not handled by onError

Hello there,

I can’t figure out why exceptions thrown from a remote function accessed via ajax are not handled in the Application.cfc’s onError method. The remote function is part of a component. I am using FW/1 btw.

Thanks in advance

Lucee Version?

5.3.3.62

Here is a minimal example to reproduce the behavior:
ajax.cfc:

<cfcomponent>
  
  <cffunction name="test" access="remote">
    <cfthrow message="error">
  </cffunction>
  
</cfcomponent>

assets/custom/js/default.js

dbg = console.log;
function test(){
  $.ajax({
    url: 'services/ajax.cfc',
    type: 'POST',
    data: {
      method: 'test'
    },
    success: function(data){
      dbg(data);
    },
    error: function(msg){
      dbg(msg);
    }
  });
}

Application.cfc:

component extends="framework.one"{
  function onError(){
    writeDump(var=now(),output="c:/temp/err_out.txt");
  }
}

layouts/main/default.cfm:

<cfoutput>
  <html>
    <head>
      <script src="assets/libs/jquery/jquery-3.3.1.min.js"></script>
      <script src="assets/custom/js/default.js"></script>
    </head>
  <body>
    layout
    #body#
  </body>
  </html>
</cfoutput>

views/main/default.cfm:

<script>
  test();
</script>

Remote function is executed, I get a 500 response in browser dev tools. But ‘c:/temp/err_out.txt’ remains the same, thus I conclude that onError is never fired.

what does the stacktrace look like, i.e from the web context logs?

That’s what I get in dev tools in the browser. Not sure if that is what you mean.

The Error Occurred in
C:\www\template_framework_one2\services\ajax.cfc: line 4
2:
3: <cffunction name="test" access="remote">
4: <cfthrow message="error">
5: </cffunction>
6:

I also have logs in ‘lucee-web\logs’ folder, if you need one of those which one?

Also here’s the complete thing in case you need the java stacktrace as well…

Lucee 5.3.3.62 Error (application)
Message	error
Stacktrace	The Error Occurred in
C:\www\template_framework_one2\services\ajax.cfc: line 4
2:
3: <cffunction name="test" access="remote">
4: <cfthrow message="error">
5: </cffunction>
6:

Java Stacktrace	lucee.runtime.exp.CustomTypeException: error
  at lucee.runtime.tag.Throw._doStartTag(Throw.java:212)
  at lucee.runtime.tag.Throw.doStartTag(Throw.java:201)
  at template_framework_one2.services.ajax_cfc$cf$1.udfCall(/template_framework_one2/services/ajax.cfc:4)
  at lucee.runtime.type.UDFImpl.implementation(UDFImpl.java:106)
  at lucee.runtime.type.UDFImpl._call(UDFImpl.java:342)
  at lucee.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:205)
  at lucee.runtime.ComponentImpl._call(ComponentImpl.java:681)
  at lucee.runtime.ComponentImpl._call(ComponentImpl.java:576)
  at lucee.runtime.ComponentImpl.callWithNamedValues(ComponentImpl.java:1926)
  at lucee.runtime.ComponentSpecificAccess.callWithNamedValues(ComponentSpecificAccess.java:156)
  at lucee.runtime.ComponentPageImpl.callWDDX(ComponentPageImpl.java:629)
  at lucee.runtime.ComponentPageImpl.call(ComponentPageImpl.java:189)
  at lucee.runtime.PageContextImpl._doInclude(PageContextImpl.java:942)
  at lucee.runtime.PageContextImpl._doInclude(PageContextImpl.java:834)
  at lucee.runtime.listener.ModernAppListener._onRequest(ModernAppListener.java:216)
  at lucee.runtime.listener.MixedAppListener.onRequest(MixedAppListener.java:42)
  at lucee.runtime.PageContextImpl.execute(PageContextImpl.java:2409)
  at lucee.runtime.PageContextImpl._execute(PageContextImpl.java:2399)
  at lucee.runtime.PageContextImpl.executeCFML(PageContextImpl.java:2374)
  at lucee.runtime.engine.Request.exe(Request.java:43)
  at lucee.runtime.engine.CFMLEngineImpl._service(CFMLEngineImpl.java:1109)
  at lucee.runtime.engine.CFMLEngineImpl.serviceCFML(CFMLEngineImpl.java:1055)
  at lucee.loader.engine.CFMLEngineWrapper.serviceCFML(CFMLEngineWrapper.java:97)
  at lucee.loader.servlet.CFMLServlet.service(CFMLServlet.java:51)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
  at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
  at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
  at org.cfmlprojects.regexpathinfofilter.RegexPathInfoFilter.doFilter(RegexPathInfoFilter.java:47)
  at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
  at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
  at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
  at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
  at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:64)
  at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
  at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
  at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
  at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
  at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
  at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
  at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
  at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
  at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
  at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
  at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
  at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
  at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
  at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
  at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
  at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
  at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
  at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
  at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
  at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
  at io.undertow.server.Connectors.executeRootHandler(Connectors.java:336)
  at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
  at java.lang.Thread.run(Unknown Source)