VoiceXML Events
Welcome to First Words, VoiceXML Review's column that teaches you about VoiceXML and how you can use it. We hope you enjoy the lesson.
VoiceXML Events
This month, we're going to have a closer look at events in VoiceXML. Over these many months, we've seen something about how events work, and how you can use them. In this column, we're going to gather all that information together, and fill in the gaps. In the next article, we'll provide some details examples of how you can use events in your application.
All About Events
Events are a powerful and important part of VoiceXML, and understanding how they work, and how to use them wisely will improve your VoiceXML development.
In many regards, VoiceXML events are similar to events or exceptions in other languages. They provide a way to generate and handle behavior related to normal or exceptional application execution.
VoiceXML events allow your application to deal with many different conditions, for example:
- Dealing with missing or unintelligible user input;
- Handling platform or system problems;
- Recovering from application or web server problems;
- Processing both normal and exceptional conditions that occur as part of application processing;
VoiceXML supports several different types of events:
- Predefined events;
- Application events;
- Platform-specific events.
Events have associated counters. Each time an event is thrown, the event counters for that event, and for any 'parent' events, are incremented. For example, if error.badfetch is thrown, the counters for both error.badfetch and error are incremented. Each form, menu, and form item maintains counters for each event within their scope.
Events are named, using a string made up of components separated by periods. The structure is used for selection of event handlers. Events also have associated messages. When processing an event, you can access the name and message using the ECMAScript variables '_event' and '_message'. The next section has some discussion about the use of these variables.
Generating An Event
Events are generated either implicitly by the VoiceXML platform, or explicitly by the application. In either case, they are effectively thrown when the Form Interpretation Algorithm reaches the 'process' phase of the FIA.
There are many events that can be thrown by the platform. These include those related to collection of user input (<noinput>, etc.) and those generated in response to some kind of error. For example error.semantic will be generated if an illegal condition if found while processing a page.
When processing normal VoiceXML elements (such as <transfer>), it is possible for events such as 'connection.transfer.disconnect' to be generated. These will indicate conditions or errors encountered while processing the element.
The application can also generate events if necessary. For example, you can use the <throw> element to generate an application event. The <throw> element accepts the following attributes:
- event - the event to be thrown;
- eventexpr - an ECMAScript expression returning the event to be thrown;
- message - the message to pass as part of the event object;
- messagexpr - an ECMAScript expression returning the message to pass as part of the event object;
Note that only one of event or eventexpr can be specified, and only one of message or messagexpr can be specified; otherwise an error.badfetch will be thrown.
Catching An Event
A <catch> element defines some VoiceXML executable content to be processed when a matching event is found. The <catch> element accepts the following attributes:
- event - the event or event family to be caught;
- count - the minimum event counter to which this catch will apply;
- cond - a guard condition for this event handler.
While processing within the event handler, you can access information about the event using the ECMAScript variables _message and _event. These are useful for controlling processing or logging information.
Event handlers are inherited through the various VoiceXML scopes as if by copy. This means that they will run as if you cut and paste them into the scope where the event was thrown. So, for example, you can define <catch> blocks in your application root document, and have them do sensible things based upon where they are invoked.
The event handlers are selected as candidates based on their name, either by an exact match, a prefix match (based on the event name components, not arbitrary substrings), or with the 'catch-all' handler (which specifies an empty event name, or just '.').
Once an event has been 'thrown' the VoiceXML Interpreter will search for a suitable catch handler. The 'best qualified' handler is selected as follows:
- A list of <catch> handlers (including those named with shorthand, such as <noinput>) is constructed. This list is ordered by scope, from the innermost (where the event has been thrown), to the outermost (the application root document); those within the same scope are added to the list in document order;
- Any which don't match the event, or which have a condition attribute which evaluates to false, are discarded;
- The list is searched for those with the highest count attribute which doesn't exceed the current count value for this event; others are discarded;
- The first element of this list is selected to handle the event;
The first event to be selected at a given level will be executed; no others from the list will be executed for this event.
VoiceXML provides some shorthand elements for commonly used event handlers:
- <cancel>
- <error>
- <help>
- <noinput>
- <nomatch>
These behave in exactly the same way as would, for example, <catch event="help">, etc.
Once the event handler has completed, processing will continue in the current dialog as dictated by the FIA, unless the event handler has initiated a transfer to another document or dialog.
Predefined Events
VoiceXML predefines many events. The table below shows some of these.
Event Type |
Audio Provided |
Action |
cancel |
no |
don't reprompt |
error |
yes |
exit interpreter |
exit |
no |
exit interpreter |
help |
yes |
reprompt |
noinput |
no |
reprompt |
nomatch |
yes |
reprompt |
maxspeechtimeout |
yes |
reprompt |
connection.disconnect |
no |
exit interpreter |
all others |
yes |
exit interpreter |
We'll talk more about these next month.
The VoiceXML Specification does not specify what the audio should be for those events that generate audio, so this will likely be different between platforms. In any case, most applications will override these handlers such that they meet their application or platform requirements. Similarly, the default action will likely be overridden as well.
Application Defined Events
You can define and use your own events to make your application development and execution more effective. It is a good idea to think about the naming convention that you will use, to allow effective use of event handlers.
Application defined events behave in exactly the same way as other events discussed in this article.
Things to Worry About
Well, these aren't really things to worry about, but things to keep in mind when you make use of events in your applications.
- You can throw system defined events if you want to;
- You can't 'rethrow' events. If you throw the same event you've just caught, you will generate either a semantic error or worse, an infinite loop;
- Your platform may provide further information about standard VoiceXML or platform-specific events as part of the _message variable (available in the anonymous scope of the <catch> element);
- Expressions and URIs within <catch> handlers, or <link> elements which specify an event, are evaluated within the scope where the event was generated. Beware, however, as this behaviour is still being specified by the Voice Browser Working Group.
- <catch> blocks are searched in document order. VoiceXML does not specify that the 'best match' will be selected (e.g., error.http over error, when they are both at in the same scope), so you should order handlers from most specific to least specific within the same scope;
- It is okay to define your own events as 'subevents' of system-defined events if it is appropriate, but make sure that they make use of the full prefix of the system event, so that handlers catching the pre-defined events will also catch your new ones;
- How your application deals with exceptional occurrences and events is an important part of your application. Think about how you will do this early in your design process.
Summary
Events are an integral part of VoiceXML, and provide a useful mechanism to handle exceptional conditions as well as application events. However, there are some fundamentals that you should understand to make the most effective use of the capabilities they provide. Once you do, you'll find them a useful addition to your toolbox for VoiceXML application development.
What's Next?
Well, we've covered events in some detail, but to finish this off, next month we'll provide some well-annotated practical examples for you to try.
back to the top
Copyright © 2001-2002 VoiceXML Forum. All rights reserved.
The VoiceXML Forum is a program of the
IEEE Industry Standards and Technology Organization (IEEE-ISTO).
|