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