Форум: "Начинающим";
Текущий архив: 2012.04.01;
Скачать: [xml.tar.bz2];
ВнизПочему «Return value must be undefined»? Найти похожие ветки
← →
И. Павел © (2011-12-12 10:10) [0]Вроде бы функция линейная. Единственное — может прерваться выполнение сгенерированным исключением. Но перехвата исключения в функции нет. Т.е. в любом случае выполнение либо дойдет до end, и тогда result := не удастся миновать, либо возникнет исключение и тогда уже не важно, возвращает функция что-то или нет. Но при проверке кода Delpgi XE выдает warning...
function TSEDDeloMonitoringYITService.GetLastHDMes: TDateTime;
var Reg: TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if not Reg.OpenKey("SOFTWARE\YITMonitoring", False) then
raise Exception.Create("Не удалось открыть раздел реестра «HKEY_LOCAL_MACHINE\SOFTWARE\YITMonitoring»");
result := Reg.ReadInteger("day") + Reg.ReadInteger("sec") / 60 / 60 / 24;
Reg.CloseKey;
finally
Reg.Free;
end;
end;
← →
Медвежонок Пятачок © (2011-12-12 10:18) [1]Оно говорит, что при определнных фазах венеры результат не получит никакого значения
← →
Anatoly Podgoretsky © (2011-12-12 10:20) [2]Вот оно
← →
И. Павел © (2011-12-12 10:23) [3]> [1] Медвежонок Пятачок © (12.12.11 10:18)
> Оно говорит, что при определнных фазах венеры результат
> не получит никакого значения
Это я понимаю. Но при каких фазах?
Если бы вместо finally стоял except то было бы ясно.
Похоже, все дело в raise. Если его удалить, warning исчезает. Но какая разница, задал ли я result, если в функции сгенерировалось исключение?
> [2] Anatoly Podgoretsky © (12.12.11 10:20)
Что оно?
← →
И. Павел © (2011-12-12 10:28) [4]В Delphi 7 то де самое.
Но вот этот блок пропускается нормально:function TForm1.GetLastHDMes: TDateTime;
begin
result := 1;
if Now = 1 then raise Exception.Create("123");
end;
Если обернуть в try/except то warning выдается, как и ожидалось.
← →
И. Павел © (2011-12-12 10:28) [5]В Delphi 7 то де самое —> В Delphi 7 то же самое
← →
Anatoly Podgoretsky © (2011-12-12 10:29) [6]> Anatoly Podgoretsky (12.12.2011 10:20:02) [2]
Не скопировалось raise
← →
Anatoly Podgoretsky © (2011-12-12 10:30) [7]> И. Павел (12.12.2011 10:28:04) [4]
А здесь присваивается значение, зачем же компилятору ругаться
← →
Медвежонок Пятачок © (2011-12-12 10:34) [8]if not then raise
результат неопределен.
А то, что он тебе не нужен, компилятор не знает.
А вдруг ты программируешь программу полета для фобос-грунт?
← →
RWolf © (2011-12-12 10:40) [9]
> Медвежонок Пятачок © (12.12.11 10:34) [8]
ну, вот ещё одна функция со столь же «неопределённым» результатом:
function GetLastHDMes: TDateTime;
begin
if Now = 1 then raise Exception.Create("123");
result := 1;
end;
на этот раз компилятор молчит.
вывод — дело в чём-то другом.
← →
И. Павел © (2011-12-12 10:44) [10]> [8] Медвежонок Пятачок © (12.12.11 10:34)
Я ведь все равно не смогу получить возвращаемое значение функции, если функция вернет исключение. Или как-то можно до него добраться?
← →
OW © (2011-12-12 10:48) [11]ну если райз то и нет резалта
а если так - то нормально
if not Reg.OpenKey("SOFTWARE\YITMonitoring", False) then
begin
result := 0;
raise Exception.Create("Íå óäàëîñü îòêðûòü ðàçäåë ðååñòðà «HKEY_LOCAL_MACHINE\SOFTWARE\YITMonitoring»")
end;
← →
Медвежонок Пятачок © (2011-12-12 10:50) [12]Компилер говорит, что результат функции может быть неопределен.
Я ведь все равно не смогу получить
А кто тебя знает, сможешь или нет.
try
dte := GetLastHDMes();
except
end;
LaunchPhobosGruntToEmptySpace(dte);
← →
OW © (2011-12-12 10:51) [13]
> Я ведь все равно не смогу получить возвращаемое значение
> функции, если функция вернет исключение. Или как-то можно
> до него добраться?
function TForm1.GetLastHDMes: TDateTime;
begin
raise Exception.Create("");
Result := -1;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
try
if GetLastHDMes > 0 then
ShowMessage( "");
except
end;
end;
← →
И. Павел © (2011-12-12 10:57) [14]> [13] OW © (12.12.11 10:51)
В этом коде операция «>» не будет выполнена. Т.е. результат GetLastHDMes все равно нигде не будет использован, в случае, если эта функция вернет исключение.
← →
RWolf © (2011-12-12 10:58) [15]
> OW © (12.12.11 10:51) [13]
что должен доказать этот код?
результата вызываемой функции он всё равно не получит.
← →
OW © (2011-12-12 11:02) [16]да и ладно, я с медвеженком про принцип
Или двоичный программист детектед? :)
ну, тогда так перепишем
var
d:TDateTime;
begin
d := 1;
try
d := GetLastHDMes;
except
if d > 0 then
ShowMessage( "") else
ShowMessage( "rrrrr");
end;
← →
И. Павел © (2011-12-12 11:10) [17]> [16] OW © (12.12.11 11:02)
Все равно ведь оператор «:=» из «d := GetLastHDMes» не выполнится. Т.е. результат функции мы так и не получили. В блоке except D по прежнему будет равна 1.
← →
RWolf © (2011-12-12 11:12) [18]
> OW © (12.12.11 11:02) [16]
опять мимо. GetLastHDMes по-прежнему не возвращает значения, d присваивается раньше вызова функции.
← →
Anatoly Podgoretsky © (2011-12-12 11:23) [19]Ну мало ли что он не получит, можно написать и более сложную программу, и пусть компилятор обзаводится мозгами.
А так все просто, проходит по коду и видит, что действительно может не получить.
← →
Dimka Maslov © (2011-12-12 11:36) [20]Поставь Result := 0 после первого бегина и не мучайся, пока ошибка явно где-нибудь не вылезет
← →
Jeer © (2011-12-12 13:23) [21]Я практически всегда первой строкой определяю временный Result в относительно сложной и ветвистой функции.
← →
И. Павел © (2011-12-12 15:09) [22]>
[20] Dimka Maslov © (12.12.11 11:36)
[21] Jeer © (12.12.11 13:23)
Но в этом подходе есть и минус: если в одном из путей ветвления забыта операция result:=, то компилятиор об этом не напомнит.
Хотя, наверное, есть смысл инициализировать resut в начале тех функции, по поводу которых компилятор необоснованно ругается, как в [0], но только после того, как эта функция написана.
← →
Юрий_ (2011-12-12 15:46) [23]Ну то есть понятно, да? Чтобы обойти явную ошибку в компиляторе (скрыть варнинг, которого на самом деле нет), приходится писать код, который сам по себе уже является ошибочным. Лишняя строка кода, ненужная - это ошибка.
← →
OW © (2011-12-12 16:05) [24]не согласен.
Первой строкой пишем резалт := теоретически_невероятный_бред, все.
Забыл где-то присвоить - получил бред, понял что не присвоено.
А если компилятор еще будет анализировать - зачем тогда прокладка м/д монитором и стулом.
Тем более, скорость компилятора delphi ого-го, что еще от него ожидать? Если бы он мусолил по часу, как иные, а то даже синтаксис нескольких строк быстрее проверить, нажав ф9, чем прочитать их.
← →
Jeer © (2011-12-13 14:37) [25]Ну, что тут сказать - бывает так перемудришь, что и сам не рад, а надо идти дальше.
Лучше поиметь заранее известный результат в случае неопределенности, чем долбаться с автоматом.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.04.01;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.003 c