Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему нет хинта что Result может быть неопределен? [D7, XP]


12 ©   (2011-01-19 16:09:00) 

Пишу:
function GetNextFromSeq(const NameSeq: string):Cardinal;
var
 oqQ: TOraQuery;
begin
// Result := 0;
 OpenQC(oqQ, 'SELECT ' + NameSeq + '.NEXTVAL as NewId FROM DUAL' , []);
 if not(oqQ.IsEmpty) then
 begin
   if not(oqQ.FieldByName('NewId').IsNull) then
     Result := oqQ.FieldByName('NewId').AsInteger else
     raise Exception.Create('function GetNextFromSeq/'+NameSeq+'/NewId Is Null');
 end else
     raise Exception.Create('function GetNextFromSeq/'+NameSeq+'/oqQ.IsEmpty');
 FreeAndNil(oqQ);
end;

Написал было по привычке вначале Result := 0; - стало ругаться, что неиспользуется. Убрал - все хорошо.

А почему?


Игорь Шевченко   (2011-01-19 18:01:00) [1]


> В D7 нету хэлперов... :(


не в термине суть


Ega23   (2011-01-19 17:52:00) [2]


> да еще бы сделал это методами helper-а к Connection

В D7 нету хэлперов... :(


Игорь Шевченко   (2011-01-19 17:51:00) [3]


> почему теперь то?


потому что ерунда

я понимаю, если б выполнял методы с именами ExecSQL, OpenSQL и т.п, да еще бы сделал это методами helper-а к Connection

А у тебя типичный набор костылей


12   (2011-01-19 17:33:00) [4]

опять выкинуть :)
почему теперь то?

не охота мне каждый раз писать
> q := TOraQwery.Create(...);
написал
CreateQ(Q);
,где сначала сессию проверяю, потом q := TOraQwery.Create(...);

не охота каждый раз писать
q.sql.text := '....';
q.params[i] := param[i];
q.open
написал
OpenQ(Q, SQL, P);
где все это делается.

потом объединил.

здорово как - объявил Query, OpenQC() ему,
он и создался, и параметры подставились, и открылся


Игорь Шевченко   (2011-01-19 17:20:00) [5]


> procedure OpenQC(Q:tORAQuery; const SQL:string; const P:
> array of variant);
> begin
>  CreateQ(Q);
>  OpenQ(Q, SQL, P);
> end;
>
> procedure CreateQ(Q:tORAQuery);
> begin
>  if Session = nil then
>    Raise Exception.Create('uUtils. CreateQ. Неинициализированная
> пременная модуля Session');


Это тоже выкинуть


12   (2011-01-19 17:02:00) [6]

ну да
procedure OpenQC(Q:tORAQuery; const SQL:string; const P:array of variant);
begin
 CreateQ(Q);
 OpenQ(Q, SQL, P);
end;

procedure CreateQ(Q:tORAQuery);
begin
 if Session = nil then
   Raise Exception.Create('uUtils. CreateQ. Неинициализированная пременная модуля Session');

и т.п.

ладно, пошел в demos ^)


Rouse_   (2011-01-19 16:50:00) [7]

Потому что у тебя условие или он будет инициализирован или поднять исключение. В случае исключения на результат функции начхать. Поэтому все верно.


Ega23   (2011-01-19 16:49:00) [8]


> Если только oqQ создается до try.

Ну не обязательно. Зависит от кода OpenQC
например
procedure OpenQC(var q: TOraQwery; ...)
begin
 q := TOraQwery.Create(...);
 try
   .....
   q.Open;
 except on E: Exception do
   begin
     q.Free;
     raise Exception.Create('OpenQC: ' + E.Message);
   end;
 end;
end;


Игорь Шевченко   (2011-01-19 16:47:00) [9]


> а как посоветуешь?


выкинуть все. посмотреть в demos, как берут очередное значение для sequence.


Ega23   (2011-01-19 16:46:00) [10]


>  потом эти строки убираю

Я вот к чему:
function Foo: Boolean;
begin
 raise Exception.Create('Foo');
end;

Тоже по-идее не даст хинтов-ворнингов.


И. Павел   (2011-01-19 16:45:00) [11]

> а так, пойдет?

Если только oqQ создается до try. Иначе там мусор может быть.


12   (2011-01-19 16:41:00) [12]


> Ну а для raise "Скрипач не нужен" (с)

это когда пишу - всегда отладочную ин-фу так выбрасываю, потом эти строки убираю
а на TApplicationEvents.Exception висит memo с ошибкой показывать
так удобнее ошибку скопировать и искать потом по коду


12   (2011-01-19 16:37:00) [13]

а так, пойдет?

 Result := 0;
 try
   OpenQC(oqQ, 'SELECT ' + NameSeq + '.NEXTVAL as NewId FROM DUAL' , []);
   if not(oqQ.IsEmpty) then
   begin
     if not(oqQ.FieldByName('NewId').IsNull) then
       Result := oqQ.FieldByName('NewId').AsInteger;
   end;
 finally
   FreeAndNil(oqQ);
 end;

и ругается уже без   Result := 0
(и с raisами предыдущими)
, если в try обернуть.


12   (2011-01-19 16:28:00) [14]

это еще не все, в try оберну сейчас что надо
сразу в sql .NEXTVAL вставлял. Сейчас надо заодно и помнить чему равно
про CURRVAL знаю :), думается так удобнее.


> Игорь Шевченко ©

а как посоветуешь?


Ega23   (2011-01-19 16:22:00) [15]

Ну а для raise "Скрипач не нужен" (с)


Ega23   (2011-01-19 16:21:00) [16]

У тебя мемлик потенциальный. Если raise произойдёт, то oqQ не будет убито.
Причём, как твой рукотворный raise, так и на OpenQC(


Игорь Шевченко   (2011-01-19 16:21:00) [17]

код в топку


sniknik   (2011-01-19 16:19:00) [18]

так не используется же... а вот убери возбуждение ексепта, тогда и будет не определен, по этой ветке.


Наверх

Титульная страница Поиск, карта сайта Написать письмо