![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему «Return value must be undefined»?
И. Павел © (2011-12-12 10:10:00)Вроде бы функция линейная. Единственное может прерваться выполнение сгенерированным исключением. Но перехвата исключения в функции нет. Т.е. в любом случае выполнение либо дойдет до 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;
Jeer (2011-12-13 14:37:00) [1]Ну, что тут сказать - бывает так перемудришь, что и сам не рад, а надо идти дальше.
Лучше поиметь заранее известный результат в случае неопределенности, чем долбаться с автоматом.
OW (2011-12-12 16:05:00) [2]не согласен.
Первой строкой пишем резалт := теоретически_невероятный_бред, все.
Забыл где-то присвоить - получил бред, понял что не присвоено.
А если компилятор еще будет анализировать - зачем тогда прокладка м/д монитором и стулом.
Тем более, скорость компилятора delphi ого-го, что еще от него ожидать? Если бы он мусолил по часу, как иные, а то даже синтаксис нескольких строк быстрее проверить, нажав ф9, чем прочитать их.
Юрий_ (2011-12-12 15:46:00) [3]Ну то есть понятно, да? Чтобы обойти явную ошибку в компиляторе (скрыть варнинг, которого на самом деле нет), приходится писать код, который сам по себе уже является ошибочным. Лишняя строка кода, ненужная - это ошибка.
И. Павел (2011-12-12 15:09:00) [4]>
[20] Dimka Maslov © (12.12.11 11:36)
[21] Jeer © (12.12.11 13:23)
Но в этом подходе есть и минус: если в одном из путей ветвления забыта операция result:=, то компилятиор об этом не напомнит.
Хотя, наверное, есть смысл инициализировать resut в начале тех функции, по поводу которых компилятор необоснованно ругается, как в [0], но только после того, как эта функция написана.
Jeer (2011-12-12 13:23:00) [5]Я практически всегда первой строкой определяю временный Result в относительно сложной и ветвистой функции.
Dimka Maslov (2011-12-12 11:36:00) [6]Поставь Result := 0 после первого бегина и не мучайся, пока ошибка явно где-нибудь не вылезет
Anatoly Podgoretsky (2011-12-12 11:23:00) [7]Ну мало ли что он не получит, можно написать и более сложную программу, и пусть компилятор обзаводится мозгами.
А так все просто, проходит по коду и видит, что действительно может не получить.
RWolf (2011-12-12 11:12:00) [8]
> OW © (12.12.11 11:02) [16]
опять мимо. GetLastHDMes по-прежнему не возвращает значения, d присваивается раньше вызова функции.
И. Павел (2011-12-12 11:10:00) [9]> [16] OW © (12.12.11 11:02)
Все равно ведь оператор «:=» из «d := GetLastHDMes» не выполнится. Т.е. результат функции мы так и не получили. В блоке except D по прежнему будет равна 1.
OW (2011-12-12 11:02:00) [10]да и ладно, я с медвеженком про принцип
Или двоичный программист детектед? :)
ну, тогда так перепишем
var
d:TDateTime;
begin
d := 1;
try
d := GetLastHDMes;
except
if d > 0 then
ShowMessage( '') else
ShowMessage( 'rrrrr');
end;
RWolf (2011-12-12 10:58:00) [11]
> OW © (12.12.11 10:51) [13]
что должен доказать этот код?
результата вызываемой функции он всё равно не получит.
И. Павел (2011-12-12 10:57:00) [12]> [13] OW © (12.12.11 10:51)
В этом коде операция «>» не будет выполнена. Т.е. результат GetLastHDMes все равно нигде не будет использован, в случае, если эта функция вернет исключение.
OW (2011-12-12 10:51:00) [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:50:00) [14]Компилер говорит, что результат функции может быть неопределен.
Я ведь все равно не смогу получить
А кто тебя знает, сможешь или нет.
try
dte := GetLastHDMes();
except
end;
LaunchPhobosGruntToEmptySpace(dte);
OW (2011-12-12 10:48:00) [15]ну если райз то и нет резалта
а если так - то нормально
if not Reg.OpenKey('SOFTWARE\YITMonitoring', False) then
begin
result := 0;
raise Exception.Create('Íå óäàëîñü îòêðûòü ðàçäåë ðååñòðà «HKEY_LOCAL_MACHINE\SOFTWARE\YITMonitoring»')
end;
И. Павел (2011-12-12 10:44:00) [16]> [8] Медвежонок Пятачок © (12.12.11 10:34)
Я ведь все равно не смогу получить возвращаемое значение функции, если функция вернет исключение. Или как-то можно до него добраться?
RWolf (2011-12-12 10:40:00) [17]
> Медвежонок Пятачок © (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:34:00) [18]if not then raise
результат неопределен.
А то, что он тебе не нужен, компилятор не знает.
А вдруг ты программируешь программу полета для фобос-грунт?
Anatoly Podgoretsky (2011-12-12 10:30:00) [19]> И. Павел (12.12.2011 10:28:04) [4]
А здесь присваивается значение, зачем же компилятору ругаться
Anatoly Podgoretsky (2011-12-12 10:29:00) [20]> Anatoly Podgoretsky (12.12.2011 10:20:02) [2]
Не скопировалось raise