[fpc-pascal] Strange syntax in raising exceptions

Paul Ishenin webpirat at mail.ru
Thu Jul 16 00:40:29 CEST 2009


Graeme Geldenhuys wrote:
> Hi,
>
> While porting DUnit2 to Free Pascal I came across the following code. 
> I have never seen syntax like that, yet it is accepted by FPC and 
> Delphi compilers.
>
> Is this documented in FPC docs? What does the '... at 
> <some_function_returning_a_pointer>' do?
>
> Unfortunately I don't have any docs (fpc, delphi or kylix) available 
> here on my home pc, but I'll try and look for tips tomorrow at work. 
> In somebody else could give some insight it would be much appreciated.
>
> =======================================
> procedure TTestProc.Warn(const ErrorMsg: string; const ErrorAddress: 
> Pointer);
> begin
>  if ErrorAddress = nil then
>    raise EPostTestFailure.Create(ErrorMsg) at CallerAddr
>  else
>    raise EPostTestFailure.Create(ErrorMsg) at ErrorAddress;
> end;
Usually you place raise ESomeException.Create() to paticular place where 
it happen. Therefore in IDE or in your application you will see error 
message with address of function where exception was raised.

But if you place raise ESomeException.Create() to some special function 
which only raises it like your Warn fiunction then address of exception 
will be useless. Who wants to know that it was raised in Warn function? 
Better to assign a caller address to that exception. For this we have 
'at' keyword.

You can replace this code:
 if ErrorAddress = nil then
   raise EPostTestFailure.Create(ErrorMsg) at CallerAddr

by next magic functions in fpc:
 if ErrorAddress = nil then
   raise EPostTestFailure.Create(ErrorMsg) at get_caller_addr(get_frame)

Best regards,
Paul Ishenin.



More information about the fpc-pascal mailing list