この記事は公開から2年以上経過しています。
過去のエントリ「C#でPower Fxのカスタム関数を実装する方法」で紹介したPower Fxのカスタム関数からエラーを返す方法。
GitHubのPower FxのDiscussionで質問したらコラボレーターとメンテナーがヒントを教えてくれました。
Thanks anderson-joyle and MikeStall!
対応
Execute()の戻り値型をFormulaValue
として、エラー時の戻り値にErrorValueを返す。
サンプルソースコード(C#)
using System;
using Microsoft.PowerFx;
using Microsoft.PowerFx.Types;
var config = new PowerFxConfig();
config.AddFunction(new MyFunc());
var engine = new RecalcEngine(config);
var ret1 = engine.Eval("If(IsError(MyFunc(\"\")), \"Error\", \"Success\")") as StringValue;
Console.WriteLine($"{ret1.Value}");
var ret2 = engine.Eval("If(IsError(MyFunc(\"Foo\")), \"Error\", \"Success\")") as StringValue;
Console.WriteLine($"{ret2.Value}");
public class MyFunc : ReflectionFunction
{
// 基底コンストラクタで戻り値の型を指定
public MyFunc()
: base("MyFunc", FormulaType.String, FormulaType.String)
{
}
// 戻り値にStringValueではなくFormulaValueを指定する
public FormulaValue Execute(StringValue param)
{
if (param.Value.Length == 0)
{
// エラー時はFormulaType.StringとしてErrorValueを返す
return ErrorValue.NewError(new ExpressionError
{
Kind = ErrorKind.InvalidArgument,
Severity = ErrorSeverity.Critical,
Message = "Invalid parameter."
}, FormulaType.String);
}
else
{
// 成功時の戻り値
return FormulaValue.New("");
}
}
}
Execute()でFormulaTypeを指定してErrorValueを返すだけです。
これまでGitHubのReflectionFunctionのテストケースのコードを参考にExecute()の戻り値をStringValueなど特定の型で定義していたためErrorValueを直接返せることに気づきませんでしたが、基底コンストラクタで戻り値の型を指定していれば、Execute()の戻り値には基底クラスであるFormulaValueを使えるというだけのことでした😅
実行結果
Error
Success
IsError()によりカスタム関数のエラーを評価することが確認できました。
参考ウェブサイトなど
- GitHub
Discussions/How can we return error value from ReflectionFunction?
以上です。