Exception QuickFix可选字段检查值存在

Exception QuickFix可选字段检查值存在,exception,field,quickfix,fix-protocol,quickfixn,Exception,Field,Quickfix,Fix Protocol,Quickfixn,我正在编写一个基于此的修复引擎,用于侦听交易执行(ExecutionReport)并将其保存到数据库中 如果接收到的消息中不存在字段值,则从API请求字段值会引发FieldNotFoundException。例如,如果帐户不存在,调用executionReport.Account将引发异常 由于某些字段是可选的,因此在获取字段值之前,我必须明确检查字段值是否存在。 我有两种可能: 可能性1: executionReport.IsSetAccount()?executionReport。帐户:空

我正在编写一个基于此的修复引擎,用于侦听交易执行(ExecutionReport)并将其保存到数据库中

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

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

可能性1:
executionReport.IsSetAccount()?executionReport。帐户:空

可能性2:

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

        }
第一个选项是干净的,但我发现它真的很重,第二个可以推广到一个helper函数中,但它违背了API的理念,我觉得我做错了什么

那么我的问题是:

  • 有没有其他干净/正确的方法来做这项工作
  • 还是我对协议/API的理解完全错误? 我觉得我没有以正确的方式解决问题

    非常感谢


你还没有真正说明你为什么认为这些东西不干净,所以我不确定你到底在找什么

我能想到的唯一选择是:

// 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.

这样更好吗?

好的,为了避免每次我想使用ExecutionReport字段时都要编写适配器类或do may check,我创建了一个执行此任务的扩展类:

    public static class ExecutionReportExtensions
{
    public static string AccountValue(this QuickFix.FIX44.ExecutionReport executionReport)
    {
        if (executionReport.IsSetAccount())
            return executionReport.Account.getValue();
        return null;
    }
然后按如下方式使用:


executexecutionReport.AccountValue()

是的,这是一种替代方案,它提供了推广ValidationOn的优势。但正如API文档中提到的,它需要额外的模板逻辑,不推荐使用,因为它的类型安全性较差。我不会说这两个选项不干净,它们都可以完成这项工作,而且在任何情况下,我都没有选择适应API提供的ExecutionReport实体。但这就是重点,API迫使我在执行get之前明确地检查字段。那么我的第二个选择就违反了这个合同。第一个选项很好,而且“干净”,但它确实很重,因为有无数的田地。就像有一个有数百个getter的DTO,每次我调用getter时都会进行明确的检查。我不认为有更干净的解决方案。这些字段是可选的,您无法获取不存在的值,因此必须检查其存在性。没有办法。我同意,只是好奇Quickfix用户是如何完成这项工作的。我想你会遇到问题的——有些字段是可选的。这是FIX协议的一个特点。几乎每个修复消息都是一样的。有很多不同的交易方式。。。