急救!声明了一个TextFile类变量,但没有使用它,会不会造成程序崩溃?(30)

  • 主题发起人 主题发起人 panchenglin
  • 开始时间 开始时间
P

panchenglin

Unregistered / Unconfirmed
GUEST, unregistred user!
项目介绍:Socket通讯服务端,客户端向服务端请求数据。症状:服务端收到客户端的请求,根据查询条件查询不到数据,就会抛出一个无数句的异常,这种情况声明的TextFile类变量得不到使用,如果连续客户端多次请求不到数据,服务端就会挂掉,连Socket连接也建立不了。我怀疑是多个TextFile类变量声明了,但是没有使用,可能也没有释放,不知道是不是这样???procedure procedureName;var dataFile : TextFile;begin.....end;
 
不会的,兄弟,但是这个就会: Var a: ttablebegin a:=ttable.create; .. 必须释放!end;
 
你这样没有使用,编译器会自动优化的
 
你说的SOCKET服务崩溃应该是你其他地方造成的."根据查询条件查询不到数据,就会抛出一个无数句的异常"你看下,你自己说的这地方是不是有什么错误造成的
 
全部代码:procedure TGjjDataDM.GetYhqqGjjgrxxData(const aUserID, aFileName, aYhbm, aGjdbm, aLmkh: string); var dataFile : TextFile; sline, s : string; cs, e025 : integer; a107, dqrq : TDate; dbg, a002, a008, a070 : string; begin if Trim(aLmkh) = '' then //如果卡号为空串、空格串,则查询结果为无数据 raise EDBException.Create(cntNoData, stNoData); cs := 0; SetLength(dbg, cntMaxLineLen); OpenDBConnection; aqGetYhqqGjjgrxxData.Close; aqGetYhqqGjjgrxxData.SQL.Clear; s := 'Select a002,a008,a011,a063,a033,a036,a038+a039 bngjje,a040,a044,a070,a034,a035,a063,a064,a107 from gzjbk where a079='''+ aLmkh +''''; aqGetYhqqGjjgrxxData.SQL.Add(s); AddDebugLog('sql: ' + s, m_Serial); aqGetYhqqGjjgrxxData.Open; if aqGetYhqqGjjgrxxData.IsEmpty then raise EDBException.Create(cntNoData, stNoData); try if FileExists(aFileName) then begin AssignFile(dataFile, aFileName); Append(dataFile); end else begin AssignFile(dataFile, aFileName); Rewrite(dataFile); end; try aqGetYhqqGjjgrxxData.First; repeat sline := ''; a002 := Trim(string(CheckIsNull(aqGetYhqqGjjgrxxData.FieldByName('a002').Value, //姓名 ' '))); sline := XStrToLenString(a002, 20); Writeln(dataFile, sline); //将数据行写入文本文件 aqGetYhqqGjjgrxxData.Next; Inc(cs); SetSafeResultStrDB(cs, m_Serial, stOperateDBNO + IntToStr(cs)); until aqGetYhqqGjjgrxxData.Eof; aqGetYhqqGjjgrxxData.Close; AddDebugLog(stOperateDBNO + IntToStr(cs), m_Serial); except raise EDBException.Create('第'+ inttostr(cs)+'条记录'+ stDBOperateErr); end; finally CloseFile(dataFile); end; end;
 
抛出异常的地方: if Trim(aLmkh) = '' then //如果卡号为空串、空格串,则查询结果为无数据 raise EDBException.Create(cntNoData, stNoData); if aqGetYhqqGjjgrxxData.IsEmpty then raise EDBException.Create(cntNoData, stNoData);
 
实验 : if Trim(aLmkh) = '' then if length(aLmkh) = 0 then
 
to wql,这样不行,因为变量aLmkh这个参数是从一个定长(30位)字符串变量获得,aLmkh有可能是30位的空格,所以必须去掉空格。
 
不要去想 TextFile 了,服务程序里主动抛出个异常的设计,令人极度迷惑,我想请教下为什么要这样做,有什么好处吗?按照现在情况看起来,这样的设计除了增加问题外,为保证系统正常运行,也许还要增加一个员工编制来为服务程序服务。
 
难道不知道还有一个叫 LogServer 的东西么?这个东西可以提供 Log 信息,当然也可以提供异常日志,服务程序中严格禁止抛出异常是应该遵守的基本要求。
 
没有使用的局部变量,一般会被编译器优化去掉。就算没去掉,也不过是在进入此过程时栈上多占一个位置而已。没其他影响。只是服务程序一般在后台悄悄运行,如此明目张胆的抛出异常,比较搞笑。
 
to 所有关注这个帖子的朋友,“服务程序里主动抛出个异常的设计”,我再考虑一下是否有更好的办法,谢谢大家的关注。
 
可以肯定这不是使程序崩溃的原因
 
后退
顶部