User Guide

Table Of Contents
Handling errors in UDFs 191
If the UDF is defined using the cffunction tag, throw a custom exception, or rethrow the
exception so that it will be caught by the calling ColdFusion page. For more information on
throwing and rethrowing exceptions, see “Handling runtime exceptions with ColdFusion tags
on page 322.
Generating exceptions in UDFs
If you define your function using the
cffunction tag, you can use the cfthrow and cfrethrow
tags to throw errors to the page that called the function. You can use this technique whenever
your UDF identifies an error, instead of displaying a message or returning an error status. For
example, the following code rewrites the example from “Providing status information
on page 187 to use the
cffunction tag and CFML, and to throw and handle an exception if any
of the form values are not positive numbers.
The lines that identify invalid data and throw the exception are in bold. The remaining lines are
equivalent to the CFScript code in the previous example. However, the code that removes
unwanted characters must precede the error checking code.
<cffunction name="TotalInterest">
<cfargument name="principal" required="Yes">
<cfargument name="annualPercent" required="Yes">
<cfargument name="months" required="Yes">
<cfset var years = 0>
<cfset var interestRate = 0>
<cfset var totalInterest = 0>
<cfset principal = trim(principal)>
<cfset principal = REReplace(principal,"[\$,]","","ALL")>
<cfset annualPercent = Replace(annualPercent,"%","","ALL")>
<cfif ((principal LE 0) OR (annualPercent LE 0) OR (months LE 0))>
<cfthrow type="InvalidData" message="All values must be greater than 0.">
</cfif>
<cfset interestRate = annualPercent / 100>
<cfset years = months / 12>
<cfset totalInterest = principal*
(((1+ interestRate)^years)-1)>
<cfreturn DollarFormat(totalInterest)>
</cffunction>
The code that calls the function and handles the exception looks like the following. The changed
lines are in bold.
<cftry>
<cfset status = StructNew()>
<cfset myInterest = TotalInterest(Form.Principal, Form.AnnualPercent,
Form.Months, status)>
<cfoutput>
Loan amount: #Form.Principal#<br>
Annual percentage rate: #Form.AnnualPercent#<br>
Loan duration: #Form.Months# months<br>
TOTAL INTEREST: #myInterest#<br>
</cfoutput>