Компилятор показывает мне следующее предупреждение для кода ниже:Как избавиться от предупреждения компилятора, запутанного `continue`?
Warning: W1036 Variable 'Address' might not have been initialized
Код (MVCE сниппета, основанный на реальном коде):
function DoFoo(): Integer;
var
i: Integer;
Address, Bar: Cardinal;
begin
for i := 1 to 5 do
begin
try
Address := Hex2CardPos(IntToStr(i));
except on EConvertError do
continue;
end;
Bar := Address + 42; // "Warning: Address might not have been initialized"
end;
Result := 42;
end;
Как вы можете видеть, Address
либо:
- Назначено к результату
Hex2CardPos()
Hex2CardPos()
выдает ошибку, и итерация цикла немедленно пропускается.
Я попытался это исправить, добавив бесполезный Address := 0;
в начале цикла, а затем предупреждение просто заменяется другим:
Hint: H2077 Value assigned to 'Address' never used.
Является ли это ошибка компилятора или делает предупреждение есть вещество?
Функция 'TryHex2CardPos' сделала бы вашу жизнь намного проще здесь –
@DavidHeffernan Что бы эта функция вернулась в случае плохого ввода, который запускает« EConvertError »? Кажется чистым, чтобы он мог вызвать исключение и позволить обработчику справиться с этим. – DBedrenko
Если вы ожидаете регулярно обрабатывать плохие входные данные, то версия, указывающая на успех или неудачу с помощью логического типа, обычно более чистая, чем версия, использующая исключения. Как правило, если вы хотите обернуть один вызов функции низкого уровня в обработчике исключений, эта функция плохо разработана. См. 'StrToInt' и' TryStrToInt'. –