19 イベントハンドリング

プラットフォームは、ユーザが応答しない場合、明瞭に返答しない場合、ヘルプを要求した場合、などにイベントを投げる。VoiceXML処理系は、VoiceXMLドキュメント内の意味的な誤りを発見した場合、<throw>要素に遭遇した場合にイベントを投げる。イベントは文字列により識別される。

ある要素の中でイベントが起こりうる場合、その要素は以下のようなキャッチ要素を持つ。

ある1つの要素は、必要に応じて、その上位の要素からキャッチ要素を(コピーされたように)継承する。

例えばもし1つのfield要素がnomatchのためのキャッチ要素を含まず、上位のform要素がnomatchを含むならば、そのform要素のnomatchが用いられる。この方法で、共通のイベントハンドリングの振る舞いはすべてのレベルで指定可能であり、それはすべての下位要素に適用される。

19.1 throw

<throw>要素はイベントを投げる。いくつかのイベントはあらかじめ定義されている。

 
     <throw event="nomatch"/>
     <throw event="telephone.disconnect.hangup"/>
 

またはアプリケーションで定義されたイベントも使用できる。

 
     <throw event="com.att.portal.machine"/>
 

<throw>の属性

event 投げられるイベント名

19.2 catch

catch要素はキャッチ処理をドキュメント、対話またはフォーム項目と結び付ける。catch要素は実行可能内容を含む。

 
     <form id="launch_missiles">
       <field name="password">
         <prompt> コード単語は何ですか? </prompt>
         <grammar> カブハボタン </grammar>
         <help> それはあいまいな野菜の名前です。 </help>
         <catch event="nomatch noinput" count="3">
          <prompt> セキュリティ違反! </prompt>
          <submit next="apprehend_felon" namelist="user_id"/>
         </catch>
       </field>
       <block>
         <goto next="#get_city"/>
       </block>
     </form>
 

<catch>要素の属性

event catchの対象となる1つまたは複数のイベント(訳注:イベントは空白区切りリスト。複数のイベントのそれぞれのためにcount属性を管理すべき(VoiceXML 2.0 Working Draft))。
count イベントの発生回数(デフォルト値は1)。countにより同じイベントを回数ごとに異なる方法で処理できる。フォーム項目と<menu>は処理されている間イベント発生数カウンタを維持する;これらのカウンタは<menu>またはフォーム項目の<form>の処理に入り直すときにリセットされる。
cond イベントをこの要素でキャッチすべきかどうかを指定するためのオプション条件。デフォルトは真(true)。

19.3 略記法

<error>, <help>, <noinput>および<nomatch>要素は、<catch>要素のよく使用される形式のための略記法である。

<error>要素は<catch event="error">の省略であり、error型のすべてのイベントをキャッチする。

 
     <error>
      エラーが発生しました -- 後ほど電話してください。
      <exit/>
     </error>
 

<help>要素は<catch event="help">の省略である。

 
     <help> ヘルプは用意されていません。 </help>
 

<noinput>要素は<catch event="noinput">の省略である。

 
     <noinput>聞き取れませんでした。もう一度入力してください。</noinput>
 

<nomatch>要素は<catch event="nomatch">の省略である。

 
     <nomatch>入力がありましたが、知らない都市でした。</nomatch>
 

これらの要素は次のような属性を持つ。

count イベントの発生回数。(<catch>と同様)
cond イベントをこの要素でキャッチすべきかどうかを指定するためのオプション条件(<catch>と同様)。デフォルトは真(true)。

19.4 キャッチ要素の選択

ある1つの要素は、必要に応じて、その上位の要素からキャッチ要素を(コピーされたように)継承する。

イベントが投げられるとき、イベントが処理される有効範囲と、その有効範囲を内包する上位の有効範囲について、最適なキャッチ要素が選択される。そのアルゴリズムは以下の通りである:

投げられたイベントの名前が正確に一致するか、あるいは接頭辞が一致していれば、投げられたイベントはキャッチ要素とマッチすると見なされる。catch要素のevent属性が投げられるイベントの名前と共通の接頭辞を持つ場合に接頭辞が一致したと見なされる。例えば、

 
     <catch event="telephone.disconnect">
 

これはtelephone.disconnect.transferイベントと接頭辞が一致する。

19.5 デフォルトのキャッチ要素

アプリケーションの作者がnoinput, help, nomatch, cancel, exitおよびerrorイベントのハンドラを指定しない場合は、VoiceXML処理系が暗黙のデフォルトのハンドラを提供することが期待されている。

さまざまなイベントやエラーのためのハンドラのデフォルトの処理は、

(1)音声応答を提供する必要があるか、

(2)どの程度実行に影響するか、

に応じて下記の表のように定義される。注:音声レスポンスが提供される場合、その内容はプラットフォーム依存である。

イベントタイプ 音声応答 アクション
cancel no repromptしない
error yes 処理系からexit
exit no 処理系からexit
help yes repromptする
noinput no repromptする
nomatch yes repromptする
telephone.disconnect no 処理系からexit
allother yes 処理系からexit

特定のプラットフォームとlocaleによって、デフォルトのプロンプトは異なる。

19.6 イベントタイプ

イベントにはあらかじめ定義済みのイベントとアプリケーション定義のイベントがある。イベントはまた、通常イベント(通常発生)とエラーイベント(異常発生)に細分される。エラーの命名規約は複数のレベルが許される。

定義済みのイベント

cancel ユーザが再生中のプロンプトのキャンセルを要求した。
telephone.disconnect.hangup ユーザが回線をハングアップした。
telephone.disconnect.transfer ユーザが別の回線へ転送され制御が戻らない。
exit ユーザがexitを要求した。
help ユーザがヘルプを要求した。
noinput ユーザが制限時間内に応答しなかった。
nomatch ユーザが何かを入力したが、認識できなかった。

定義済みのエラー:

error.badfetch フェッチの失敗。ドキュメントが存在しない場合、URI入力ミス、ドキュメントフェッチ処理中の通信エラー、タイムアウト、セキュリティ違反、または不正なドキュメント、などによる。
error.semantic ランタイムエラーがVoiceXMLドキュメントで起きた。例:0除算、サブストリング境界エラー、または未定義変数の参照。
error.noauthorization ユーザがリクエストした操作を実行する権限をもたない。(無効な電話番号にダイヤルした、またはユーザが電話をかけることを許可されていない。)
error.unsupported.format リクエストされたリソースがプラットフォームによりサポートされていない。例:サポートされていない文法フォーマット、オーディオファイルフォーマット、オブジェクトタイプまたはMIMEタイプ。
error.unsupported.element プラットフォームが要素elementをサポートしていない。例えば、もしプラットフォームが<record>を実装しないなら、error.unsupported.recordを投げなければならない。これにより開発者は、さまざまなプラットフォームの能力に対応できる。

アプリケーション依存エラータイプは以下の形式に従うべきである:

error.com.mot.mix.noauth 個人情報へのアクセスする権限を持たない。
error.com.ibm.portal.restricted 制限されたリソースへのアクセスをドキュメントが試みた。

catchは特定のイベント(cancel)または、接頭辞(error.unsupported)を共有するすべてのイベントをキャッチできる。