Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Exception.RaiseOuterException vs. W1035 Return value of function '%s' might be undefined

Tags:

delphi

This already is reported as RSP-25603: "Exception.RaiseOuterException can cause wrong W1035 warning".


Given the following (demo) function F, I have changed an exception raising statement to now chain exceptions:

--- before
+++ after
@@ -1,11 +1,11 @@
 function F(X: NativeInt): NativeInt;
 begin
   try
     Result := 1 div X;
   except
     on EDivByZero do
-      {ECustom}Exception.Create('...');
+      Exception.RaiseOuterException({ECustom}Exception.Create('...'));
     else
       raise;
   end;
 end;

Now, Ctrl-F9 gives the warning W1035:

[dcc32 Warning]: W1035 Return value of function 'F' might be undefined

However, all cases are handled. The compiler fails to recognize Exception.RaiseOuterException as the raise operation it is.

Unfortunately FAcquireInnerException: Boolean is private to the Exception class, not even to be set to True in derived custom classes which I could keep raising directly (raise ECustomException.Create).

Is there any way to make the compiler understand, while keeping the exceptions chained? Otherwise I can think of {$Warn No_RetVal Off}. How else could I work around this warning?

like image 825
Max Avatar asked Nov 14 '20 14:11

Max


1 Answers

One way I can think of to avoid the warning, without disabling it, is to do the following instead:

function F(X: NativeInt): NativeInt;
begin
  try
    Result := 1 div X;
  except
    on E: Exception do
    begin
      if E is EDivByZero then
        Exception.RaiseOuterException({ECustom}Exception.Create('...'));
      raise;
    end;
  end;
end;

UPDATE: Another way, as stated in a comment, would be to simply define a return value that is not actually reached at runtime, eg:

function F(X: NativeInt): NativeInt;
begin
  try
    Result := 1 div X;
  except
    on E: EDivByZero do
    begin
      Exception.RaiseOuterException({ECustom}Exception.Create('...'));
      Result := 0; // <-- just to keep the compiler happy
    end;
  end;
end;
like image 83
Remy Lebeau Avatar answered Nov 15 '22 09:11

Remy Lebeau