Предупреждение компилятора "возвращаемое значение может быть неопределенным" - PullRequest
12 голосов
/ 04 июля 2011

Я часто использую код в следующих строках:

function GetNumber(Handle : THandle) : Integer;
begin
FLock.BeginRead;
try
  if FMap.TryGetValue(Handle, Object) then
    raise EArgumentException.Create('Invalid handle');
  Result := Object.Number;
finally
  FLock.EndRead;
end;
end;

К сожалению, компилятор выдает мне предупреждение для всех этих методов:

[DCC Warning] Unit.pas(1012): W1035 Return value of function 'GetNumber' might be undefined

Я знаю это предупреждение, но в этом случае я не вижу никакой причины для этого вообще. Или есть сценарий, который мне не хватает, который привел бы к неопределенному значению результата? Я понимаю предупреждение в случае try..except, но для try..finally оно не имеет смысла для меня.

Вопросы:

  • Есть ли причина для предупреждения?
  • Как мне избавиться от этого (перемещение строки Result := Object.Number из блокировки не вариант, и я хочу избежать написания совершенно ненужной строки Result := 0 в верхней части каждой функции)

Спасибо!

Ответы [ 3 ]

5 голосов
/ 04 июля 2011

Есть ли причина для предупреждения?

Я не вижу его, но оно есть из-за raise

Как можноЯ избавился от этого (перемещение строки Result: = Object.Name из блокировки не является вариантом, и я хочу избежать записи совершенно ненужного результата: = 0 в верхней части каждой функции)

Переместите оператор поднятия в собственную процедуру.

function GetNumber(Handle : THandle) : Integer;
    procedure InvHandle;
    begin
        raise EArgumentException.Create('Invalid handle');
    end;
begin
    FLock.BeginRead;
    try
        if FMap.TryGetValue(Handle, Object) then
            InvHandle;
        Result := Object.Number;
    finally
        FLock.EndRead;
    end;
end;
3 голосов
/ 04 июля 2011

Это ошибка компилятора.Если try/finally удалено, то предупреждение не выдается.Компилятор уже давно может распознать, что raise освобождает кодера от обязанности присваивать возвращаемое значение.По какой-то причине try/finally, кажется, запутывает свой анализ.


Если подумать, возможно, это не ошибка компилятора.Что если код в блоке finally остановил распространение исключения?Очевидно, что нет обработчика except, но я скорее подозреваю, что одна из подпрограмм поддержки исключений в модуле System или SysUtils может остановить дальнейшее развитие исключения.

0 голосов
/ 04 июля 2011

Назначение

Result := ...;

в блоке finally отсутствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...