What happens in a Model-Glue application when you pass in an unknown event? An error is thrown. While this makes sense - it may not be desired behavior for an application. For example - I'd probably consider most unknown events to be 404 errors. So how can you handle it?
Model-Glue lets you define the event to fire when an error occurs. In Model-Glue: Unity you can find this setting in the ColdSpring.xml file
<property name="defaultExceptionHandler"><value>exception</value></property>
The "out of the box" exception event in Model-Glue prints out a few pieces of information from the exception. Obviously you wouldn't have that on a live site. Normally I simply take the exception and mail it to myself (along with the form, url, and session scopes).
So how did I handle the unknown event? The first thing I did was dump the exception that Model-Glue was throwing. I was hoping a certain code would be thrown, but the only information I could use was the exception message. It was in this form:
Model-Glue: There is no known event handler for "x".
So I first added this to my exception file:
<!---
Look for event handler missing.
--->
<cfif findNoCase("Model-Glue: There is no known event handler for", exception.message)>
<cflocation url="/">
</cfif>
When this didn't work - I did a quick view source and discovered there were two spaces between Model-Glue: and the message. So I quickly changed it to:
<!---
Look for event handler missing.
--->
<cfif findNoCase("Model-Glue: There is no known event handler for", exception.message)>
<cflocation url="/">
</cfif>
Obviously you should consider doing more than just sending the user away. You could log the event to the database and see if there is a particular event being called multiple times.
You could also use logic to check for typos or commonly mistyped URLs. For example - someone keeps trying to load the event, "page.rss/", at RIAForge. Notice the / at the end? I whipped up this code to handle it:
<cfif findNoCase("Model-Glue: There is no known event handler for", exception.message)>
<cfset unknownEvent = rereplace(exception.message, ".*""(.*?)"".*", "\1")>
<cfif unknownEvent is "page.rss/">
<cflocation url="#viewState.getValue("myself")#page.rss" addToken="false">
<cfelse>
<cflocation url="/">
</cfif>
</cfif>
By the way - I bugged Joe to consider adding a "Unknown Event" configuration setting to the framework.