存在QuickFix可选字段检查值

时间:2017-10-11 17:48:47

标签: exception field quickfix fix-protocol quickfixn

我正在编写一个基于Quickfix/N的FIX引擎,它监听交易Executions(ExecutionReport)并将它们保存到数据库中。

如果接收到的消息中不存在该值,则从API请求字段值会抛出FieldNotFoundException。例如,如果帐户不存在,则调用executionReport.Account将抛出异常。

由于某些字段是可选的,因此我必须在获取之前明确检查字段值是否存在。 我有两种可能性:

可能性1: executionReport.IsSetAccount() ? executionReport.Account : null;

可能性2:

  try
        {
            return executionReport.Account.getValue();
        }
        catch (Exception e)
        {
            return null;

        }

第一个选项是干净但我发现它很重,第二个可以推广到辅助函数但是它违背了API哲学,我觉得我做错了。

然后我的问题是:

  • 还有其他干净/正确的工作方式吗?
  • 或者我对Protocol / API的理解是完全错误的? 我觉得我没有以正确的方式解决问题。

    非常感谢

2 个答案:

答案 0 :(得分:3)

你还没有说明为什么你认为那些是不洁净的,所以我不确定你究竟在寻找什么。

我能想到的唯一选择是:

// Both these lines are functionally identical.
executionReport.IsSetField(1)
executionReport.IsSetField(QuickFix.Fields.Tags.Account)

// 1 is the tag for Account.
// The second line just uses the tag enum to get 1
//   instead of hardcoding the int.

这样更好吗?

答案 1 :(得分:0)

好的,为了避免编写适配器类或者每次我想使用ExecutionReport字段时都可以检查,我创建了一个扩展类来完成这项工作:

    public static class ExecutionReportExtensions
{
    public static string AccountValue(this QuickFix.FIX44.ExecutionReport executionReport)
    {
        if (executionReport.IsSetAccount())
            return executionReport.Account.getValue();
        return null;
    }

然后按如下方式使用它:

executexecutionReport.AccountValue()