Error、IfError、IsError、IsBlankOrError 関数
適用先 : キャンバス アプリ Dataverse 数式列 デスクトップ フロー モデル駆動型アプリ Power Platform CLI
エラーを検出し、代替値を提供するか、操作を実行します。 カスタム エラーを作成するか、エラーを渡します。
注
- この記事で説明する動作は、設定 > 近日公開の機能 > プレビューを通じて数式レベルのエラー管理プレビュー機能がオンになっている場合にのみ使用できます。
IfError
IfError 関数は、エラーが見つかるまで値をテストします。 関数がエラーを検出した場合、関数は対応する置換値を評価して返し、それ以降のさらに詳しい評価を停止します。 エラーが見つからない場合は、既定値を指定することもできます。 IfError の構造は If 関数の構造に似ています: IfError はエラーをテストし、If は true をテストします。
IfError を使用してエラーを有効な値に置き換えて、下流の計算を続行できるようにします。 たとえば、ユーザー入力がゼロによる除算になる可能性がある場合は、次の関数を使用します。
IfError( 1/x, 0 )
x
の値がゼロの場合 1/x
はエラーを生成するため、この数式は 0
を返します。 x
がゼロでない場合、1/x
が返されます。
以降の処理を停止する
Patch( DS1, ... );
Patch( DS2, ... )
DS1
への Patch が 失敗しても DS2
への 2 つ目の Patch 関数が試行されます。 エラーの範囲は、連鎖された各数式に制限されます。
IfError を使用してアクションを実行し、アクションが成功した場合にのみ処理を続行します。 この例に IfError を適用します:
IfError(
Patch( DS1, ... ), Notify( "problem in the first action" ),
Patch( DS2, ... ), Notify( "problem in the second action" )
)
DS1
の Patch に問題がある場合、1 つ目の Notify が実行されます。 DS2
の 2 つ目の Patch を含む以降の処理は行なわれません。 1 つ目の Patch が成功した場合、2 つ目の Patch が実行されます。
指定した場合、エラーが検出されない場合は、任意の DefaultResult 引数が返されます。 この引数がなければ、最後の値引数が返されます。
最後の例を基にして、IfError からの戻り値を照合して問題があったかどうかを特定することができます。
IfError(
Patch( DS1, ... ), Notify( "problem in the first action" ); false,
Patch( DS2, ... ), Notify( "problem in the second action" ); false,
true
)
種類の互換性
IfError はその引数の 1 つの値を返します。 IfError によって返される可能性があるすべての値の種類は互換性がなければなりません。
最後の例で、Patch は Replacement 数式または DefaultResult で使用されたブール値と互換性のないレコードを返します。 これらの Patch 呼び出しからの戻り値が IfError によって返されるという状況はないので、これは問題ありません。
Note
変更の動作中の間、現在 IfError へのすべての引数の種類は互換性がある必要があります。
前述の簡単な例では:
IfError( 1/x, 0 )
1/x
と 0
の種類は両方とも数字であるため互換性がありました。 そうでない場合、2 つ目の引数は最初の引数の種類と一致するように強制されます。
エクセルでは、ゼロ除算が発生した場合、#DIV/0! が表示されます。
代わりに、次のように IfError を検討します。
IfError( 1/x, "#DIV/0!" )
上記の数式は機能しません。 テキスト文字列 "#DIV/0!"
は、最初の引数の種類を IfErrorに強制され、それは数値です。 IfError の結果はテキスト文字列を強制できないため、さらに別のエラーとなります。 修正として、最初の引数をテキスト文字列に変換して、IfError が常にテキスト文字列を返すようにします。
IfError( Text( 1/x ), "#DIV/0!" )
上に示すように、Replacement または DefaultResult がエラーの場合、IfError はエラーを返すことができます。
FirstError / AllErrors
置換式内では、検出されたエラーに関する情報を FirstError レコードと AllErrors テーブルで確認することができます。 AllErrors はエラー情報レコードのテーブルで、FirstError はこのテーブルの最初のレコードへのショートカットです。 FirstError は常に First( AllErrors ) と同じ値を返します。
エラーのレコードには次が含まれています:
フィールド | タイプ | 説明設定 |
---|---|---|
種類 | ErrorKind 列挙 (数値) | エラーのカテゴリ。 |
Message | テキスト文字列 | エンド ユーザーに表示するのに適した、エラーに関するメッセージ。 |
Source | テキスト文字列 | 報告用に使用される、エラーの発生した場所です。 たとえば、コントロール プロパティにバインドされた数式の場合、これは ControlName.PropertyName の形式になります。 |
Observed | テキスト文字列 | エラーがユーザーに表示される場所で、レポートに使用されます。 たとえば、コントロール プロパティにバインドされた数式の場合、これは ControlName.PropertyName の形式になります。 |
詳細情報 | 記録 | エラーに関する詳細。 現在、詳細はネットワーク エラーについてのみ提供されています。 このレコードには、HTTP ステータス コードを含む HttpStatusCode と、コネクタやサービスからの応答の本文を含む HttpResponse が含まれています。 |
たとえば、次の数式を Button コントロールの OnSelect プロパティとして検討します。
Set( a, 1/0 )
この式は Button コントロールの OnSelect プロパティに適用されます。
IfError( a, Notify( "Internal error: originated on " & FirstError.Source & ", surfaced on " & FirstError.Observed ) )
上記の数式の例では、2 つのボタンを順番にアクティブにすると、次のバナーが表示されます。
通常、FirstError が十分に対応できるエラーは 1 つだけです。 ただし、複数のエラーが返される場合があります。 たとえば、数式連鎖演算子 や Concurrent 関数の使用時などです。 このような状況でも、FirstError を報告することで、複数のエラーでユーザーに負担をかける代わりに、問題を明らかにできる可能性があります。 それでも各エラーを個別に処理する要件がある場合は、AllErrors テーブルを使用します。
IsError
IsError 関数はエラー値をテストします。
戻り値は、ブール値の true または false です。
IsError を使用すると、エラーの以降の処理が実行されなくなります。
IsBlankOrError
IsBlankOrError 関数は、空白値またはエラー値のいずれかをテストし、Or( IsBlank( X ), IsError( X ) )
と同等のものです。
既存のアプリに対するエラー処理を有効化する際、IsBlank を IsBlankOrError で置き換えて既存アプリの動向を保存することを検討してください。 エラー処理を追加する前に、空欄 の値は、データベースからの null 値とエラー値の両方を表すために使用されました。 エラー処理は、これら 2 つの 空欄 の解釈を分離します。これは、引き続き IsBlank を使用する既存のアプリの動作が変わる可能性があります。
戻り値は、ブール値の true または false です。
IsBlankOrError を使用すると、エラーのそれ以上の処理を防ぎます。
Error 関数を使用して、カスタム エラーを作成し、報告します。 たとえば、与えられた値がその文脈で有効かどうかを判断するロジックがあるかもしれない-自動的に問題がチェックしない何かが存在します。 上記の IfError 関数と同じレコードを使用して、Kind と Message を含む独自のエラーを作成し、返すことができます。
IfError のコンテキストでは、Error 関数を使用して、エラーを再スローまたはパスします。 たとえば、IfError エラーを安全に無視できる場合もあれば、エラーを送信することが重要である場合もあります。 IfError や App.OnError 内で、Error( FirstError ) を使用して、エラーを通過させることができます。
Error 関数には、AllErrors テーブルにあるようなエラー テーブルも渡すことができます。 最初のエラーだけでなく、すべてのエラーを取り消すには Error( AllErrors ) を使用します。
ブランクのレコード、または空のテーブルが Error に渡された場合、エラーは発生しません。
構文
Error( ErrorRecord )
Error( ErrorTable )
- ErrorRecord – 必須。 Kind、Message などのフィールドを含むエラー情報のレコードです。 Kind は必須です。 FirstError は直接渡すことができます。
- ErrorTable – 必須。 エラー情報レコードのテーブル。 AllErrors は直接渡すことができます。
IfError( Value1, Replacement1 [, Value2, Replacement2, ... [, DefaultResult ] ] )
- Value(s) – 必須。 エラー値をテストする数式。
- Replacement(s) – 必須。 評価する数式、および一致する値の引数がエラーを返した場合に返される値。
- DefaultResult – オプション。 数式にエラーが見つからないかどうかを評価する数式。
IsError( Value )
IsBlankOrError( 値 )
- Value – 必須。 テストする式。
例
簡単な IfError
式 | 内容 | 結果 |
---|---|---|
IfError( 1, 2 ) | 最初の引数は、エラーではありません。 この関数には、チェックする他のエラーおよび既定の戻り値はありません。 関数は、評価された最後の値引数を返します。 | 1 |
IfError( 1/0, 2 ) | 最初の引数は、(ゼロによる除算のため) エラー値を返します。 関数は 2 番目の引数を評価し、結果として返します。 | 2 |
IfError( 10, 20, 30 ) | 最初の引数は、エラーではありません。 関数には、チェックする他のエラーはありませんが、既定の戻り値はあります。 関数は、DefaultResult 引数を返します。 | 30 |
IfError( 10, 11, 20, 21, 300 ) | 最初の引数 10 はエラーではないので、関数はその引数の対応する置換である 11 を評価しません。 3 番目の引数 20 もエラーではないので、関数はその引数の対応する置換である 21 を評価しません。 5 番目の引数 300 には対応する置換がなく、既定の結果です。 数式にはエラーを含まないため、関数はその結果を返します。 | 300 |
IfError( 1/0, Notify( "There was an internal problem" ) ) | 最初の引数は、(ゼロによる除算のため) エラー値を返します。 関数は 2 番目の引数を評価し、ユーザーにメッセージを表示します。 IfError の戻り値は Notify の戻り値であり、IfError の最初の引数 (数値) と同じ種類に強制されます。 | 1 |
簡単な IsError
式 | 内容 | 結果 |
---|---|---|
IsError( 1 ) | 引数は、エラーではありません。 | 偽 |
IsError( Blank() ) | この引数は空白ですが、エラーではありません。 | 偽 |
IsError( 1/0 ) | 引数が、エラーです。 | true |
If( IsError( 1/0 ), Notify( "There was an internal problem" ) ) | IsError の引数は、(ゼロによる除算のため) エラー値を返します。 この関数は true を返します。これは If を使用してユーザーに Notify 関数でメッセージを表示します。 If の戻り値は Notifyの戻り値であり、If の最初の引数 (ブール値) と同じ種類に強制されます。 | true |
Simple IsBlankOrError
式 | 内容 | 結果 |
---|---|---|
IsBlankOrError( 1 ) | この引数は、エラーでも空白でもありません。 | 偽 |
IsBlankOrError( Blank() ) | この引数は空白です。 | true |
IsBlankOrError( 1/0 ) | 引数が、エラーです。 | true |
単純なエラー
この例では、日付を相対的に検証し、問題がある場合はエラーとなります。
If( StartDate > EndDate,
Error( { Kind: ErrorKind.Validation, Message: "Start Date must be before End Date" } ) )
この例では、一部のエラーは通過が許可され、他のエラーは抑制されて値に置き換えられます。 最初のケースでは、Value関数に無効な引数があるため、b がエラー状態になります。 これは数式作成者によって予期されていないため、ユーザーに表示されるように渡されます。 2 番目の場合、同じ式で、b の値 0 となり、ゼロ除算になります。 この場合、数式作成者はこのロジックでは許容範囲であることを知り、エラーを抑制し (バナーは表示されない)、代わりに -1 を返すことがあります。
With( {a: 1, b: Value("a")},
IfError( a/b, If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ), -1 ) ) )
// returns an error with Kind = ErrorKind.InvalidArgument
With( {a: 1, b: 0} )
IfError( a/b, If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ), -1 ) ) )
// returns -1
AllErrors テーブルは、他のテーブルと同じようにフィルタリングできます。 Error 関数と併用することで、予期されるエラーを除去し、残りのエラーを保持して報告することができます。 たとえば、ゼロによる除算が特定のコンテキストで問題にならないことが分かっている場合、以下の式でそれらのエラーをフィルタリングし、他のエラーをそのまま残すことができます:
Error( Filter( AllErrors, Kind <> ErrorKind.Div0 ) )
手順
Text input コントロールを追加し、既定でその名前が付いていない場合は TextInput1 という名前を付けます。
Label コントロールを追加し、既定でその名前が付いていない場合は Label1 という名前を付けます。
Label1 の Text プロパティを次の数式に設定します。
IfError( Value( TextInput1.Text ), -1 )
TextInput1 に、1234 を入力します。
Label1 は Value 関数への有効な入力値として 1234 の値を表示します。
TextInput1 に、ToInfinity を入力します。
Label1 は Value 関数への有効な入力値ではないため -1 の値を表示します。 Value 関数を IfError で折り返さない場合、エラー値が空白として扱われるためラベルには値が表示されません。