Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.04.01;
Скачать: CL | DM;

Вниз

Почему «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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.007 c
15-1323165693
Scott Storch
2011-12-06 14:01
2012.04.01
обозвать поля


15-1321017183
Бездомный
2011-11-11 17:13
2012.04.01
Когда, интересно, появятся компьютеры, способные


15-1322773113
Германн
2011-12-02 00:58
2012.04.01
Список устройств в "Диспетчере оборудования"


15-1322857803
Юрий
2011-12-03 00:30
2012.04.01
С днем рождения ! 3 декабря 2011 суббота


2-1323630561
CheCoder
2011-12-11 23:09
2012.04.01
Delphi 7. Почему Image1.Canvas не печатается?