Power Fxのカスタム関数からエラーを返す方法

この記事は公開から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?

以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする