エラーハンドリング

イントロダクション

エラーハンドリングは、プログラムの実行中に発生する例外的な状況に対応するためのメカニズムです。アプリケーションは、フィルタで発生したエラーの後も実行を継続することができます。

このメカニズムは、主に IO_ERROR 種別のエラーを処理するために使用されるべきです。 他の種類のエラーの使用は注意が必要です。 すべてのアプリケーションは DOMAIN_ERROR を排除する方法で作成できます。 このトピックは別の記事で詳しく説明されています: ドメインエラーの処理。 この種のエラーの一般的な原因は、SkipEmptyRegionなどのフィルタを省略することです。

エラーハンドリングは、タスクマクロフィルタにのみ追加できます。 エラーが発生した後のタスクマクロフィルタの再実行には、それに含まれる状態を持つフィルタのリセットが伴います。これは特にカメラや他のデバイスへの再接続を意味します。 各種類のエラーのエラーハンドラは、ステップマクロフィルタのように実行されます。

特別なケースとして、起動プログラム(通常: Main )として設定されたタスクマクロフィルタのエラーハンドラがあります。 エラーハンドラが終了した後、プログラムの実行は常に終了します。

処理できるエラーの種類にはいくつかあります:

  • IO_ERROR
    I/O 操作中または外部デバイス(カメラ、ネットワーク、デジタル I/O カード、ストレージなど)との対話中に発生したエラー。
  • SYSTEM_ERROR
    オペレーティングシステムによって発生したエラー(例: メモリの割り当てに失敗、ドライバやライブラリの不足など)。
  • DOMAIN_ERROR
    フィルタまたは関数の不正な使用、通常は入力値から(例: 有効な範囲外)。
  • LICENSE_ERROR
    ライブラリ(AVL)の使用に必要なライセンスが不足しているためのエラー。
  • ANY_ERROR
    プログラムの実行中に発生したすべての上記の種類、および特定できないランタイムエラーを含みます。

エラーの種類によって、処理は2つの異なる方法で進行します:

  • IO_ERROR
    DOMAIN_ERROR
    SYSTEM_ERROR

    これらのエラーのいずれかが発生した後、プログラムは最寄りのエラーハンドラに入ります。 ハンドラの完了後、実行はエラーが発生したタスクの直後から再開されます。呼び出し元(親のマクロフィルタ)はこのタスクを正常に完了したものと見なします。
  • ANY_ERROR
    LICENSE_ERROR

    これらの種類は致命的なエラーであり、アプリケーションは実行を継続できません。 このようなエラーが発生した後、最寄りのエラーハンドラが実行されますが、ハンドラの完了後、エラーは "アクティブ" のままです。 つまり、呼び出し元またはそれ以上のマクロフィルタは、この種のエラーのために独自のハンドラを実行し、最終的にプログラムは停止します。これらのエラーの処理は、オペレータに致命的なシステムエラーを通知し、サービス対応を要求する手段として使用できます。

各タスクマクロフィルタには、異なるエラーの種類のための複数のハンドラが存在できます。 エラーが発生した場合、まず特定の種類のハンドラが確認され、そのハンドラが存在しない場合は(定義されていれば)ANY_ERRORハンドラが使用されます。

エラーを処理した後にアプリケーションを継続させたい場合は、ANY_ERRORハンドラを使用しないでください。このエラーハンドラを実行すると、常にアプリケーションが停止します。

ANY_ERRORのエラーハンドラは、アプリケーションを終了する前にユーザーに問題を通知する手段として扱うべきです。

エラーハンドラの追加

エラーハンドラは、プロジェクトエクスプローラでタスクマクロフィルタを右クリックし、「新しいエラーハンドラの追加...」を選択して追加できます。

次に、ハンドラの種類を選択する必要があります。

種類を選択した後、それはプロジェクトエクスプローラに追加され、対象のタスクマクロフィルタの下に表示されます:

エラーハンドラをダブルクリックして編集できます。

プログラムの実行

IDEでのプログラム実行中にエラーが発生した場合、メッセージが表示され、続行(つまりエラーハンドラの実行)のオプションが表示されます。このメッセージは、IDEの設定で無効にすることができます。「ツール」»「設定」»「プログラムの実行」: 「例外が発生したときに中断」を変更します。

ランタイム環境では理解できるように、メッセージは表示されず、エラーハンドリングが直ちに実行されます。

以下は、カメラから画像をループで取得する単純な例です。カメラが接続されていない場合、エラーハンドラに入り、エラーが発生しなくなるまでメッセージが返されます。 エラーハンドリングがない場合、最初の画像取得が失敗するとプログラムが停止します:

エラーハンドラを備えたサンプルプログラム。Macrofilter GrabImage には IO_ERROR(右側)用のエラーハンドラがあり、エラーメッセージが表示されます。

エラーハンドラの実行後の結果。

通常のプログラム実行後の結果。

生成されたC++コード

C++コード生成では、エラーハンドリングを生成するか、ユーザー(プログラマー)に実装を任せるかを選択するオプションがあります。エラーハンドリングオプションが有効になっている場合、エラーハンドラを備えたタスクマクロフィルタから生成された関数内のフィルタ呼び出しは、"try ... catch"ブロックで囲まれます。以下はその例です:

void GrabImage( void )
{
	avl::WebCamera_GrabImageState webCamera_GrabImageState1;
	avl::Image image1;
	
	try
	{
		for(;;)
		{
			if (!avl::WebCamera_GrabImage(webCamera_GrabImageState1, 0, atl::NIL, image1))
			{
				return;
			}
		}
	}
	catch(const atl::IoError&)
	{
		atl::String string1;
		
		string1 = atl::String(L"Camera is not connected");
	}
}