У меня бывает так, что, увлекшись, пишу функцию за функцией, забывая про эту проверку, а потом ошибку вылавливаю долго...
Приведу пример. Вот, допустим, функция нахождения лучшей цены спроса:
function GetBestSellPrice(aInitRec : TLibInitialRecord; aSecInfo : PSecInfo) : double;
var
cnt : integer;
tmpQuotes : PAtQuoteArray;
tmpPBestBuy,
tmpPBestSell : PATQuote;
begin
Result := -1;
cnt:=aInitRec.fATLibGetQuotesCount(aSecInfo^.Idx);
GetMem (tmpQuotes,cnt*sizeOf(TATQuote));
if aInitRec.fATLibGetQuotes(aSecInfo^.Idx,cnt,
tmpPBestBuy,tmpPBestSell,tmpQuotes)<>0 then exit;
if (tmpPBestSell<>nil) then Result := tmpPBestSell.Price;
FreeMem (tmpQuotes,cnt*sizeOf(TATQuote));
end;
Сначала я забыла проверить, что fATLibGetQuotes возвращает 0 (т.е. функция успешно отрабатывает). Это привело к тому, что время от времени вылезал непонятный баг с определением цены.
Обратите внимание, что проверка на nil указателя возвращенного tmpPBestSell в этом случае оказалась бесполезной (она была, но не спасала от ошибочного определения цены).
Самое противное в таких ошибках — их несистематичность. То есть прога может отработать несколько часов подряд без сбоев или сбой повторится раза 3 за минуту после запуска. Это связано с механизмом — QuikOrdersDOM работает напрямую с памятью. А проверка результатов, возвращаемых функциями, и их грамотная обработка — полностью защитит вас от непредвиденных ситуаций и вернет работу робота под контроль.
Комментариев нет:
Отправить комментарий