ドメインエラーの取り扱い

イントロダクション

ドメインエラーは、フィルタの前提条件が満たされていない場合にプログラムの実行を停止させます。一般的に、すべての可能な ドメインエラー を自動的に予測することはできません。これはユーザーの責任で、最終バージョンのプログラムにそれらが現れないように確認する必要があります。

ドメインエラーの例:

  • SelectChannel フィルタがモノクロ画像の第二チャネルを取得しようとすると、"[ドメインエラー] SelectChannel でチャネルインデックスが範囲外です。" が発生します。
  • DivideIntegers フィルタが inB = 0 で呼び出されると、"[ドメインエラー] DivideIntegers で入力の除数がゼロです。" が発生します。
  • RegionMassCenter フィルタが空の領域で呼び出されると、"[ドメインエラー] RegionMassCenter で入力領域が空です。" が発生します。

ドメインエラーは、コンソールウィンドウで報告されます。コンソールウィンドウに表示されるリンクをクリックすることで、ドメインエラーを発生させたフィルタインスタンスを強調表示できます:

コンソールウィンドウのフィルタへのリンク。

Emptyオブジェクトの処理

Domain Errorsの最も一般的なソースの1つは、出力が空のオブジェクトの場合に未定義であるフィルターです。 RegionMassCenter フィルターを考えてみましょう。空の領域の質量の中心はどこにあるのでしょうか?答えは: 未定義です。 結果を計算できないため、フィルターはDomain Errorをスローしてプログラムの実行を停止します。

プログラムにこのようなフィルターが含まれ、事前条件が常に満たされることを保証できない場合、特殊なケースを明示的に解決する必要があります。 空のオブジェクトを処理する方法の1つは、フィルターの変種を Unsafe から OrNil に変更することです。これにより、単に実行をスキップし、フィルターの出力にNil値を割り当てます。 OrNil フィルターの変種に関する詳細はこちらで確認できます。

もう1つの可能な解決策は、guardian フィルターのいずれかを使用して、空のオブジェクトを条件付き処理に変換することです。 これらのフィルターには、SkipEmptyArraySkipEmptyRegionSkipEmptyPathSkipEmptyProfileSkipEmptyHistogramSkipEmptyDataHistogramがあります。

ThresholdToRegion フィルターの使用例として、その後に RegionMassCenter を使用する可能性のあるエラー状況があります。 いくつかのケースでは、最初のフィルターが空の領域を生成し、次に Domain Error が発生する可能性があります。 これを防ぐには、適切なデータフローを作成するために OrNil バリアントを使用する必要があります。

RegionMassCenter が空の入力領域で Domain Error をスローしてプログラムの実行が停止している例。

RegionMassCenterOrNil バリアントで正しく使用した例。

RegionMassCenter が正しく SkipEmptyRegion で先行している例。条件付き処理が表示されています。

別の典型的な例は、ある特徴の最大値を持つオブジェクトを選択しようとする場合です(例:最大のブロブ)。 この目的には GetMaximumElement フィルターが使用できますが、オブジェクトが見つからない場合(配列が空の場合)、 Domain Error が発生します。この場合、問題を解決するために Unsafe オプションの代わりに OrNil オプションを使用すると良いでしょう。