Error、IfError、IsError、IsBlankOrError 関数
適用対象: キャンバス アプリ Dataverse 数式列 デスクトップ フロー モデル駆動型アプリ Power Pages Power Platform CLI
エラーを検出し、代替値を提供するか、操作を実行します。 カスタム エラーを作成するか、エラーを渡します。
注意
アプリが [設定] [更新] [廃止]> の >数式レベルのエラー管理機能を無効にしている場合、それらの機能は正しく動作しません。
IfError
IfError 関数は、エラーが見つかるまで値をテストします。 関数がエラーを検出した場合、関数は対応する置換値を評価して返し、それ以降のさらに詳しい評価を停止します。 エラーが見つからない場合は、既定値を指定することもできます。 IfError の構造は If 関数の構造に似ています: IfError はエラーをテストし、If は true をテストします。
IfError を使用してエラーを有効な値に置き換えて、下流の計算を続行できるようにします。 たとえば、ユーザー入力がゼロによる除算になる可能性がある場合は、次の関数を使用します。
IfError( 1/x, 0 )
この数式は、 0
の値が x
ゼロの場合、 1/x
エラーを生成するとして返します。 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番目の引数は最初の引数の型と一致するように強制変換されます。
ゼロ除算が発生すると、Excelは #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 列挙 (数値) | エラーのカテゴリ。 |
メッセージ | テキスト文字列 | エンド ユーザーに表示するのに適した、エラーに関するメッセージ。 |
ソース | テキスト文字列 | 報告用に使用される、エラーの発生した場所です。 たとえば、コントロール プロパティにバインドされた数式の場合、この値は ControlName.PropertyName の形式になります。 |
観察された | テキスト文字列 | エラーがユーザーに表示される場所で、レポートに使用されます。 たとえば、コントロール プロパティにバインドされた数式の場合、この値は ControlName.PropertyName の形式になります。 |
詳細 | Record | エラーに関する詳細。 現在、ネットワーク エラーについてのみ詳細が提供されています。 このレコードには、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 に渡された場合、エラーは発生しません。
構文
エラー( エラーレコード )
エラー( エラーテーブル )
- ErrorRecord – 必須。 Kind、Message などのフィールドを含むエラー情報のレコードです。 Kind は必須です。 FirstError を直接渡すことができます。
- ErrorTable – 必須。 エラー情報レコードのテーブル。 AllErrors を直接渡すことができます。
IfError( Value1, Replacement1 [, Value2 , 置換2, ... [, DefaultResult ] ] )
- 値 – 必須。 エラー値をテストする数式。
- 交換品 – 必須。 評価する数式、および一致する値の引数がエラーを返した場合に返される値。
- DefaultResult – オプション。 数式にエラーが見つからないかどうかを評価する数式。
IsError( 値 )
IsBlankOrError( 値 )
- 値 – 必須。 テストする式。
例
簡単な IfError
式 | 内容 | 結果 |
---|---|---|
エラーの場合(1, 2) | 最初の引数は、エラーではありません。 この関数には、チェックする他のエラーおよび既定の戻り値はありません。 関数は、評価された最後の値引数を返します。 | 1 |
エラーの場合(1/0, 2) | 最初の引数は、(ゼロによる除算のため) エラー値を返します。 関数は 2 番目の引数を評価し、結果として返します。 | 2 |
エラーの場合(10, 20, 30) | 最初の引数は、エラーではありません。 関数には、チェックする他のエラーはありませんが、既定の戻り値はあります。 関数は、DefaultResult 引数を返します。 | 30 |
エラーの場合(10, 11, 20, 21, 300) | 最初の引数 10 はエラーではないので、関数はその引数の対応する置換である 11 を評価しません。 3 番目の引数 20 もエラーではないので、関数はその引数の対応する置換である 21 を評価しません。 5 番目の引数 300 には対応する置換がなく、既定の結果です。 数式にはエラーを含まないため、関数はその結果を返します。 | 300 |
IfError( 1/0, Notification( "内部に問題が発生しました" ) ) | 最初の引数は、(ゼロによる除算のため) エラー値を返します。 関数は 2 番目の引数を評価し、ユーザーにメッセージを表示します。 IfError の戻り値は Notify の戻り値であり、IfError の最初の引数 (数値) と同じ種類に強制されます。 | 1 |
簡単な IsError
式 | 内容 | 結果 |
---|---|---|
エラー(1) | 引数は、エラーではありません。 | 間違い |
IsError( 空白() ) | この引数は空白ですが、エラーではありません。 | 間違い |
エラーです(1/0) | 引数が、エラーです。 | 真実 |
If( IsError( 1/0 ), Notification( "内部に問題が発生しました" ) ) | IsError の引数は、(ゼロによる除算のため) エラー値を返します。 この関数は true を返します。これは If を使用してユーザーに Notify 関数でメッセージを表示します。 If の戻り値は Notifyの戻り値であり、If の最初の引数 (ブール値) と同じ種類に強制されます。 | 真実 |
Simple IsBlankOrError
式 | 内容 | 結果 |
---|---|---|
空白またはエラー( 1 ) | この引数は、エラーでも空白でもありません。 | 間違い |
IsBlankOrError( 空白() ) | この引数は空白です。 | 真実 |
空白またはエラー( 1/0 ) | 引数が、エラーです。 | 真実 |
単純なエラー
この例では、日付を相対的に検証し、問題がある場合はエラーとなります。
If( StartDate > EndDate,
Error( { Kind: ErrorKind.Validation, Message: "Start Date must be before End Date" } ) )
この例では、一部のエラーは通過が許可されますが、他のエラーは抑制されて値に置き換えられます。 最初のケースでは、 b は、 Value 関数に無効な引数があるため、エラー状態になります。 これは数式の作成者にとっては予期しないものなので、ユーザーに見えるように渡されます。 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には値 1234 が表示されます。これはValue関数への有効な入力です。
TextInput1 に、ToInfinity を入力します。
Label1には値 -1 が表示されますが、これはValue関数への有効な入力ではありません。 Value 関数を IfError で折り返さない場合、エラー値が空白として扱われるためラベルには値が表示されません。