【发布时间】:2014-04-11 11:08:39
【问题描述】:
我有一个 quickfix .net 应用程序。我正在使用.net/c++ version of quickfix
有时我的应用程序会抛出此错误,我无法使用 try catch 块捕获它。 修复消息的长度约为 3000。我不会每次都收到此错误。 这是事件日志:
框架版本:v4.0.30319 描述:进程被终止 由于未处理的异常。异常信息: System.AccessViolationException 堆栈:在 System.String..ctor(SByte*) 在 QuickFix.Group.getField(QuickFix.StringField) 在 FixApplication.onMessage(QuickFix44.MarketDataIncrementalRefresh, QuickFix.SessionID)在 QuickFix44.MessageCracker.crack(QuickFix.Message, QuickFix.SessionID) 在 QuickFix.MessageCracker.crack(QuickFix.Message,QuickFix.SessionID, QuickFix.BeginString) 在 QuickFix.MessageCracker.crack(QuickFix.Message, QuickFix.SessionID)
在 FixApplication.fromApp(QuickFix.Message, QuickFix.SessionID) 在 .Application.fromApp(Application*, FIX.Message*, FIX.SessionID*)
抛出错误的行:
public override void onMessage(QuickFix44.MarketDataIncrementalRefresh msg, SessionID sessionID)
{
try
{
var mdReqId = new MDReqID();
if (msg.isSet(mdReqId))
msg.get(mdReqId);
var noMdEntries = new NoMDEntries();
if (msg.isSet(noMdEntries))
msg.get(noMdEntries);
int noMdEntriesInt;
if (Int32.TryParse(noMdEntries.ToString(), out noMdEntriesInt))
{
for (uint i = 1; i <= noMdEntriesInt; i++)
{
var group = new MarketDataIncrementalRefresh.NoMDEntries();
Group repeatedData;
if (msg.isSet(noMdEntries))
{
repeatedData = msg.getGroup(i, group);
var mdUpdateAction = new MDUpdateAction();
if (repeatedData.isSetField(mdUpdateAction))
repeatedData.getField(mdUpdateAction);
var mdEntryType = new MDEntryType();
if (repeatedData.isSetField(mdEntryType))
repeatedData.getField(mdEntryType);
var symbol = new Symbol();
if (repeatedData.isSetField(symbol))
repeatedData.getField(symbol);
var mdEntryPx = new MDEntryPx();
if (repeatedData.isSetField(mdEntryPx))
repeatedData.getField(mdEntryPx);
var mdEntrySize = new MDEntrySize();
if (repeatedData.isSetField(mdEntrySize))
repeatedData.getField(mdEntrySize);
var numberOfOrders = new NumberOfOrders();
if (repeatedData.isSetField(numberOfOrders))
repeatedData.getField(numberOfOrders);
var mdEntryPositionNo = new MDEntryPositionNo();
if (repeatedData.isSetField(mdEntryPositionNo))
repeatedData.getField(mdEntryPositionNo);
var quoteCondition = new QuoteCondition();
if (repeatedData.isSetField(quoteCondition))
repeatedData.getField(quoteCondition);
var sysSymbolId = 0;
var mdEntryId = new MDEntryID();
if (repeatedData.isSetField(mdEntryId))
{
repeatedData.getField(mdEntryId);//THIS LINE THROWS ERROR
string strMdEntryId = mdEntryId.getValue();
}
//}
}
}
}
}
Functions.WriteDebugLog("OK");
}
catch (Win32Exception e)
{
Functions.WriteSystemLog("Ex Msg:" + e.ToString() + " Fix Msg : " + msg.ToString());
}
catch (Exception ex)
{
Functions.WriteSystemLog("Ex Msg:" + ex.ToString() + " Fix Msg : " + msg.ToString());
}
}
这是修复消息(您可以使用此在线工具解析它:http://fixloganalyzer.com/):
8=FIX.4.4|9=2254|35=X|34=21998|49=*|50=*| 52=20140411-07:52:52.472|56=**|262=1397202772472|268=42|279=1|278=25500|270=2.11636|271=3500000|276=A| 290=1|279=1|278=25501|270=2.11626|271=2000000|276=A|290=2|279=1|278=25502|270=2.11616|271=3000000|276=A|290= 3|279=1|278=25504|270=2.11596|271=7000000|276=A|290=5|279=1|278=25510|270=2.11716|271=3500000|276=A|290=1| 279=1|278=25512|270=2.11736|271=5000000|276=A|290=3|279=1|278=25513|270=2.11746|271=5000000|276=A|290=4|279= 1|278=25514|270=2.11756|271=6000000|276=A|290=5|279=1|278=204|270=1.38947|271=1500000|276=A|290=5|279=1| 278=600|270=0.93834|271=1000000|276=A|290=1|279=1|278=601|270=0.93833|271=1000000|276=A|290=2|279=1|278= 602|270=0.93832|271=1000000|276=A|290=3|279=1|278=603|270=0.93831|271=2000000|276=A|290=4|279=1|278=604| 270=0.93821|271=2000000|276=A|290=5|279=1|278=610|270=0.93839|271=1000000|276=A|290=1|279=1|278=611|270= 0.9384|271=1500000|276=A|290=2|279=1|278=613|270=0.93843 |271=3500000|276=A|290=4|279=1|278=614|270=0.93844|271=3000000|276=A|290=5|279=1|278=2200|270=1.09337|271 =1000000|276=A|290=1|279=1|278=2201|270=1.09336|271=1000000|276=A|290=2|279=1|278=2203|270=1.09334|271=4000000 |276=A|290=4|279=1|278=2204|270=1.09333|271=1000000|276=A|290=5|279=1|278=2211|270=1.09344|271=2000000|276 =A|290=2|279=1|278=2214|270=1.09356|271=3000000|276=A|290=5|279=1|278=19600|270=1.08182|271=1000000|276=A |290=1|279=1|278=19601|270=1.08181|271=1000000|276=A|290=2|279=1|278=19602|270=1.0818|271=1000000|276=A|290 =3|279=1|278=19603|270=1.08179|271=1000000|276=A|290=4|279=1|278=19604|270=1.08178|271=1000000|276=A|290=5 |279=1|278=19612|270=1.08205|271=1000000|276=A|290=3|279=1|278=19613|270=1.08206|271=1000000|276=A|290=4|279 =1|278=19614|270=1.08216|271=2000000|276=A|290=5|279=1|278=23600|270=1.51927|271=2000000|276=A|290=1|279=1 |278=23601|270=1.51926|271=1000000|276=A|290=2|279=1|278=23602|270=1.51925|271=1000000|276=A|290=3|279=1|278 =23603|270=1.51915|271=3000000|276=A|29 0=4|279=1|278=23604|270=1.51905|271=4000000|276=A|290=5|279=1|278=23610|270=1.51945|271=1500000|276=A|290= 1|279=1|278=23611|270=1.51946|271=1000000|276=A|290=2|279=1|278=23612|270=1.51947|271=1000000|276=A|290=3| 279=1|278=23613|270=1.51957|271=2000000|276=A|290=4|279=1|278=23614|270=1.51967|271=3000000|276=A|290=5|10= 142|
【问题讨论】:
-
您可能正在尝试提取原始 FIX 消息中不存在的
field。当异常发生时,你能粘贴你正在解析的 FIX 消息吗? -
我已经粘贴了修复信息。
-
您是否尝试过调试?没有人会浏览您发布的那条重要的 FIX 消息。
-
正常工作。几个小时后我运行程序,它给出了错误。它不会每次都给它。因此,我无法解决
-
fixparser 的大链接
标签: c# c++ quickfix fix-protocol