W1035 Return value of function 'Test' might be undefined 在添加 try-finally 块后意外出现
W1035 Return value of function 'Test' might be undefined unexpectedly appears after adding a try-finally block
我在编译时遇到意外的 W1035:
[dcc32 Warning] Unit1.pas(40): W1035 Return value of function 'Test'
might be undefined
function CheckFn() : Boolean;
begin
Result := True;
end;
function Test() : Boolean;
begin
try
if(not CheckFn()) then
raise Exception.Create('Error Message');
Result := True;
finally
end;
end;
如果我删除 try-finally
块,则警告消失。
function Test() : Boolean;
begin
if(not CheckFn()) then
raise Exception.Create('Error Message');
Result := True;
end;
为什么会这样? (错误?)
我们来分析一下Test
。
- 如果
CheckFn
引发异常,您会立即转到 finally
子句,然后离开该函数而不 return 输入值。
- 否则,如果
CheckFn
returns True
,你将从函数中return True
。
- 否则,如果
CheckFn
returns False
,您将引发异常并立即转到 finally
子句,然后离开没有 return输入一个值。
因此,在所有情况下,当此函数执行 return 一个值时,它是已定义的(具体来说,它是 True
)。因此,编译器发出此警告是错误的。
而且,事实上,在 Delphi 10.4 中,没有针对此代码生成警告。
(或者,您是否将 finally
与 except
混淆了?如果是这样,编译器是正确的。)
我在编译时遇到意外的 W1035:
[dcc32 Warning] Unit1.pas(40): W1035 Return value of function 'Test' might be undefined
function CheckFn() : Boolean;
begin
Result := True;
end;
function Test() : Boolean;
begin
try
if(not CheckFn()) then
raise Exception.Create('Error Message');
Result := True;
finally
end;
end;
如果我删除 try-finally
块,则警告消失。
function Test() : Boolean;
begin
if(not CheckFn()) then
raise Exception.Create('Error Message');
Result := True;
end;
为什么会这样? (错误?)
我们来分析一下Test
。
- 如果
CheckFn
引发异常,您会立即转到finally
子句,然后离开该函数而不 return 输入值。 - 否则,如果
CheckFn
returnsTrue
,你将从函数中returnTrue
。 - 否则,如果
CheckFn
returnsFalse
,您将引发异常并立即转到finally
子句,然后离开没有 return输入一个值。
因此,在所有情况下,当此函数执行 return 一个值时,它是已定义的(具体来说,它是 True
)。因此,编译器发出此警告是错误的。
而且,事实上,在 Delphi 10.4 中,没有针对此代码生成警告。
(或者,您是否将 finally
与 except
混淆了?如果是这样,编译器是正确的。)