Functions | 対象 |
---|---|
Error IfError IsError |
|
IsBlankOrError |
|
エラーを検出し、代替値を提供するか、操作を実行します。 カスタム エラーを作成するか、エラーを渡します。
ヒント
アプリが [設定] [更新] [廃止]> の >数式レベルのエラー管理機能を無効にしている場合、それらの機能は正しく動作しません。
IfError
IfError関数は、エラーが見つかるまで値をテストします。 関数がエラーを検出した場合、関数は対応する置換値を評価して返し、それ以降のさらに詳しい評価を停止します。 エラーが見つからない場合は、既定値を指定することもできます。 IfErrorの構造は If 関数の構造に似ています。IfErrorエラーをテストし、If は true をテストします。
IfErrorを使用して、ダウンストリームの計算を続行できるように、エラーを有効な値に置き換えます。 たとえば、ユーザー入力がゼロによる除算になる可能性がある場合は、次の関数を使用します。
IfError( 1/x, 0 )
この数式は、 0
の値が x
ゼロの場合、 1/x
エラーを生成するとして返します。
x
がゼロでない場合、1/x
が返されます。
以降の処理を停止する
Patch( DS1, ... );
Patch( DS2, ... )
への Patch が 失敗しても DS2
への 2 つ目の 関数が試行されます。 エラーの範囲は、連鎖された各数式に制限されます。
IfErrorを使用してアクションを実行し、アクションが成功した場合にのみ処理を続行します。 この例への IfError の適用:
IfError(
Patch( DS1, ... ), Notify( "problem in the first action" ),
Patch( DS2, ... ), Notify( "problem in the second action" )
)
の DS1
に問題がある場合、1 つ目の Notify が実行されます。
の 2 つ目の DS2
を含む以降の処理は行なわれません。 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によって返される状況はありません。
ヒント
変更の処理中の動作中に、 IfError するすべての引数の型は現在互換性がある必要があります。
前述の簡単な例では:
IfError( 1/x, 0 )
1/x
と 0
の種類は両方とも数字であるため互換性がありました。 そうでない場合、2番目の引数は最初の引数の型と一致するように強制変換されます。
Excelでは、ゼロ除算が発生すると #DIV/0! と表示されます。
代わりに次の IfError を検討してください。
IfError( 1/x, "#DIV/0!" )
上記の数式は機能しません。
"#DIV/0!"
テキスト文字列は、IfErrorする最初の引数の型 (数値) に強制変換されます。 テキスト文字列を強制できないため、 IfError の結果はもう 1 つのエラーです。 修正として、最初の引数をテキスト文字列に変換して、 IfError が常にテキスト文字列を返すようにします。
IfError( Text( 1/x ), "#DIV/0!" )
上記のように、置換または DefaultResult がエラーの場合、IfErrorはエラーを返すことができます。
FirstError /AllErrors
置換式内では、検出されたエラーに関する情報を FirstError レコードと AllErrors テーブルで確認することができます。 AllErrors はエラー情報レコードのテーブルであり、 FirstError はこのテーブルの最初のレコードへのショートカットです。 FirstError は常に First( AllErrors )と同じ値を返します。
Error レコードには次のものが含まれます。
フィールド | タイプ | 説明設定 |
---|---|---|
親切 | 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値とエラー値の両方を表すために 空白 値が使用されていました。 Error 処理では、これら 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 – 必須。 Error 種類、メッセージ、その他のフィールドを含む情報レコード。 Kind は必須です。 FirstError を直接渡すことができます。
- ErrorTable – 必須。 エラー情報レコードのテーブル。 AllErrors を直接渡すことができます。
IfError( Value1, Replacement1 [, Value2, Replacement2, ...[, DefaultResult ] ])
- 値 – 必須。 エラー値をテストする数式。
- 交換品 – 必須。 評価する数式、および一致する値の引数がエラーを返した場合に返される値。
- DefaultResult – オプション。 数式にエラーが見つからないかどうかを評価する数式。
IsError( 値 )
IsBlankOrError( 値 )
- 値 – 必須。 テストする式。
例
簡単 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, 通知( "内部の問題が発生しました" ) ) | 最初の引数は、(ゼロによる除算のため) エラー値を返します。 関数は 2 番目の引数を評価し、ユーザーにメッセージを表示します。 IfErrorの戻り値は Notify の戻り値であり、IfErrorする最初の引数 (数値) と同じ型に強制されます。 | 1 |
簡単 IsError
式 | 説明設定 | 結果 |
---|---|---|
IsError( 1 ) | 引数は、エラーではありません。 | 間違い |
IsError( Blank() ) | この引数は空白ですが、エラーではありません。 | 間違い |
IsError( 1/0 ) | 引数が、エラーです。 | 真実 |
If( IsError( 1/0 ), Notify( "内部の問題が発生しました" ) ) | IsErrorする引数は、エラー値を返します (0 除算のため)。 この関数は true を返します。これは If を使用してユーザーに Notify 関数でメッセージを表示します。 If の戻り値は Notifyの戻り値であり、If の最初の引数 (ブール値) と同じ種類に強制されます。 | 真実 |
簡単 IsBlankOrError
式 | 説明設定 | 結果 |
---|---|---|
IsBlankOrError( 1 ) | この引数は、エラーでも空白でもありません。 | 間違い |
IsBlankOrError( Blank() ) | この引数は空白です。 | 真実 |
IsBlankOrError( 1/0 ) | 引数が、エラーです。 | 真実 |
簡単 Error
この例では、日付を相対的に検証し、問題がある場合はエラーとなります。
If( StartDate > EndDate,
Error( { Kind: ErrorKind.Validation, Message: "Start Date must be before End Date" } ) )
この例では、一部のエラーは通過が許可されますが、他のエラーは抑制されて値に置き換えられます。 最初のケースでは、 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 を入力します。
ラベル1には値が表示されます 1234 これはValue関数への有効な入力です。
TextInput1 に、ToInfinity を入力します。
ラベル1には値が表示されます -1 これはValue関数への有効な入力ではないためです。 Value 関数を IfError でラップしないと、エラー値が 空白として扱われるので、ラベルに値は表示されません。