[Lazarus] How to make debugging ignore exceptions?

Santiago A. svaa at ciberpiula.net
Sat Jun 24 10:15:01 CEST 2017


El 24/06/2017 a las 0:14, Bo Berglund via Lazarus escribió:
The problem is that the debugger always stops on the
> exceptions making the debugging impossible (they happen with 10 ms
> intervals).
When I run into a program that raises a lot of exceptions in a loop, I
think that I'm doing something wrong, I have missed some check or data
sanitation in the loop. Exceptions are for exceptional cases. I mean,
errors or unexpected cases. A case that happens each 10 ms is not an
error or an exceptional case, it's one of the usual cases, and it must
be handled by the natural flow of the program in a structured way.
Raising continuously exceptions is not only an annoyance for debugging,
but a performance problem. Exceptions may be expensive.

For example, if you are going to process a file with lines that are
integers and alphanumeric strings, and you want to sum only the
integers, instead of

sum:=0;
While not eof(f) do begin
  readln(f,Line);
  try
    num:=StrToInt(Line);   
    sum:=sum+num;
  except
  end 
end; 

you should use

sum:=0;
While not eof(f) do begin
  readln(f,Line);
  val(num,Line,code);
  if code=0 
     then Sum:=Sum+num;
  end;
end;

I don't know the FTcpComm component. Isn't there a way to check first if
that annoying exception is going to be raised?. Probably there are
functions like "IsReadDataReady" and "isSerWriteReady", so you can avoid
a lot of exceptions

if FTcpComm.IOHandler.IsReadDataReady() then begin
      FTcpComm.IOHandler.ReadBytes(Buf, BufLen, false);
      if (Length(Buf) > 0) and isSerWriteReady(FOmH) then
      begin
        SerWrite(FComH, Buf[0], Length(Buf));
        SetLength(Buf, 0);
      end;
end;

Or with several retries in loops with a sleep.

-- 
Saludos

Santiago A.



More information about the Lazarus mailing list