views:

137

answers:

1

I have a Function in CFC file, which will be called from .cfm file like below

 <cffunction name="cftest" access="public" returntype="query" output="true" hint="Function returns Records">

      <cfquery name="qryTest" datasource="DBTest">
                select * from emp_tab;
       </cfquery>

    <cfreturn selectRecordsResultSet />

 </cffunction>

How can I handle DB Exception using cftry? as this is returning Query, Is it possible to catch the DB Exception and pass the Details to the other page from where it is called?

Thanks

+6  A: 

Here is an example of my usual implementation of this:

<cffunction name="getCurrentRecordsCount" access="public" output="false" returntype="any" hint="Get total history records count">
    <cfargument name="filters" type="struct" required="false" default="#StructNew()#" hint="Filtering rules">
    <cfset var qGetRecordCount = "" />
    <cftry>

        <cfquery datasource="#variables.dsn#" name="qGetRecordCount">
            SELECT COUNT(*) AS cnt FROM ....
        </cfquery>

        <cfreturn qGetRecordCount.cnt />

    <cfcatch type="any">
        <cfreturn error(cfcatch.message, cfcatch.detail) />
    </cfcatch>
    </cftry>
</cffunction>

If you want to handle only database errors, change type to the database.

Errors handling and reporting performed using these three methods:

<cffunction name="error" access="private" output="false" returntype="boolean" hint="Set error status and message">
    <cfargument name="message" type="string" required="true" hint="Error message text" />
    <cfargument name="detail" type="string" required="false" default="" hint="Error detail text" />
    <cfset variables.fError = true />
    <cfset variables.fErrorText = arguments.message />
    <cfif Len(arguments.detail)>
        <cfset variables.fErrorText = variables.fErrorText & " [" & arguments.detail & "]" />
    </cfif>
    <cfreturn false />
</cffunction>

<cffunction name="gotError" access="public" output="false" returntype="boolean" hint="Return latest error flag state">
    <cfreturn variables.fError />
</cffunction>

<cffunction name="getError" access="public" output="false" returntype="string" hint="Return latest error text and reset the flag">
    <cfset var txt = variables.fErrorText />
    <cfset variables.fError = false />
    <cfset variables.fErrorText = "" />
    <cfreturn txt />
</cffunction>

Please note that for methods with returntype="void" I use cfset instead of cfreturn:

<cfset error(cfcatch.message, cfcatch.detail) />

So in code I can do the following (cfscript):

// calculate filtered records count
totalLogCount = request.loggingService.getCurrentRecordsCount(filters);

// check if error was thrown
if (request.loggingService.gotError()) {
   // report the error details somehow
   WriteOutput(request.loggingService.getError());
}
Sergii
Thanks Sergii Galashyn,I got what i am looking for
CFUser