[方法] エラーを処理する方法
カスタム アプリケーションを作成するときに、開発者はエラー処理を行わなければならないことがよくあります。エラー処理では、アプリケーションで発生したエラーをチェックしたり、カスタム エラーを作成して発生させたりするプログラミング コードを記述します。Microsoft.Office.InfoPath 名前空間によって提供される InfoPath オブジェクト モデルでは、FormError クラスを FormErrorCollection クラスと共に使用するエラー処理がサポートされています。
InfoPath では、次のような場合にエラーが発生する可能性があります。
フォームに入力されたデータが XML スキーマの検証に失敗したとき。
カスタム検証の制約に違反があったとき。
XmlValidatingEventArgs イベント オブジェクトの ReportError メソッドによってエラーが生成されたとき。
FormErrorCollection クラスの Add メソッドを使用してエラーが作成されたとき。
FormErrorCollection クラスの概要
FormErrorCollection クラスには、次のメソッドとプロパティがあります。フォームの開発者は、これらを使用することにより、コレクションに含まれている FormError オブジェクトを管理できます。
名前 | 説明 |
---|---|
Add メソッド (+3 オーバーロード) |
FormError オブジェクトを作成し、それをコレクションに追加します。 |
Delete メソッド (+1 オーバーロード) |
指定したユーザー定義エラーをコレクションから削除します。 |
DeleteAll メソッド |
コレクションに含まれているすべての FormError オブジェクトを削除します。 |
GetErrors (+1 オーバーロード) |
指定した名前または型のすべての FormError オブジェクトをコレクションから返します。 |
Count プロパティ |
コレクションに含まれている ErrorObject オブジェクトの数を取得します。 |
Item プロパティ |
指定したインデックス番号に基づく ErrorObject オブジェクトへの参照を取得します。 |
FormError クラスの概要
FormError クラスには、次のプロパティがあります。フォームの開発者は、これらを使用することにより、発生したエラーに関する情報にアクセスできます。
名前 | 説明 |
---|---|
DetailedMessage プロパティ |
FormError オブジェクトの詳細なエラー メッセージを取得または設定します。 |
ErrorCode プロパティ |
FormError オブジェクトのエラー コードを取得または設定します。 |
Site プロパティ |
FormError オブジェクトに関連付けられたノードにある XPathNavigator オブジェクトを取得します。 |
Message プロパティ |
FormError オブジェクトの短いエラー メッセージを取得または設定します。 |
FormErrorType プロパティ |
FormError オブジェクトの型を取得します。 |
FormErrorCollection クラスおよび FormError クラスを使用する
フォームに関連付けられた FormErrorCollection オブジェクトにアクセスするには、XmlForm オブジェクトの Errors プロパティを使用します。FormErrorCollection オブジェクトはフォームの基になる XML ドキュメントに関連付けられているため、エラーが発生した場合は、現在の XML ドキュメント内でそのエラーや追加のエラーにアクセスし、エラーを管理することができます。次の例では、ループを使用して、フォームの基になる XML ドキュメント内にあるエラーをチェックする方法を示します。エラーがある場合は、関数で各エラーをループ処理し、FormError オブジェクトの Message プロパティを使用して、ユーザーにメッセージ ボックスを表示します。
public void CheckErrors(XPathNavigator xmlNode)
{
foreach(FormError err in this.Errors)
{
if(xmlNode.InnerXml == err.Site.InnerXml)
MessageBox.Show("The following error has occured: "
+ err.Message);
}
}
Public Sub CheckErrors(ByVal xmlNode As XPathNavigator)
Dim err As FormError
For Each err In Me.Errors
If xmlNode.InnerXml = err.Site.InnerXml Then
MessageBox.Show("The following error has occured: " _
& err.Message)
End If
End Sub
上の関数は、フォームのデータ検証イベント ハンドラの 1 つから呼び出すことができます。たとえば、フォーム内のフィールドの Changed イベントのイベント ハンドラで使用した場合、関数の呼び出しにより、次のように XmlEventArgs イベント オブジェクトの Site プロパティを使用して XML ノードが引数として渡されます。
CheckErrors(e.Site);
CheckErrors(e.Site)
InfoPath によって生成されるエラーの処理に加えて、フォームの開発者は、XmlValidatingEventArgs イベント オブジェクトの ReportError メソッド、または FormErrorCollection クラスの Add メソッドを使用して、カスタム エラーを生成することもできます。ReportError メソッドまたは Add メソッドの使用方法については、このトピックの先頭にあるそれぞれのメソッドのリンクをクリックしてください。
マネージ コードの例外を処理する
try-catch 例外処理を使用すると、次のコードに示すようにマネージ コード フォーム テンプレート内で発生した例外を処理することができます。
FileQueryConnection queryXMLFile =
(FileQueryConnection)this.DataConnections["form1"];
// Perform the query.
try
{
queryXMLFile.Execute();
}
catch (Exception ex)
{
MessageBox.Show("Failed to query." + System.Environment.NewLine
+ ex.Message);
}
Dim queryXMLFile As FileQueryConnection = _
DirectCast(Me.DataConnections("form1"), FileQueryConnection)
' Perform the query.
Try
queryXMLFile.Execute();
Catch ex As Exception
MessageBox.Show("Failed to query." & System.Environment.NewLine
& ex.Message)
End Try
フォーム コード内で try-catch 例外処理を使用していないと、デバッグ中およびプレビュー中に、未処理の例外に関する情報が InfoPath によって InfoPath のエラー ダイアログ ボックスに表示されます。また、既定では、マネージ コード フォーム テンプレートを展開した場合の実行時には、未処理の例外は Info Path エラー ダイアログ ボックスに表示されません。実行時に未処理の例外に関する情報を表示するには、次の手順を使用します。
未処理のマネージ コード例外の実行時の通知を有効にする
InfoPath を開きます。
[ツール] メニューの [オプション] をクリックします。
[詳細設定] タブで、[Visual Basic または Visual C# コードのエラーを表示する] チェック ボックスをオンにします。