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

Вниз

Почему нет хинта что Result может быть неопределен?   Найти похожие ветки 

 
12 ©   (2011-01-19 16:09) [0]

Пишу:
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; - стало ругаться, что неиспользуется. Убрал - все хорошо.

А почему?


 
sniknik ©   (2011-01-19 16:19) [1]

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


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

код в топку


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

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


 
Ega23 ©   (2011-01-19 16:22) [4]

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


 
12 ©   (2011-01-19 16:28) [5]

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


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

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


 
12 ©   (2011-01-19 16:37) [6]

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

 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:41) [7]


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

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


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

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

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


 
Ega23 ©   (2011-01-19 16:46) [9]


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

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

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


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


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


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


 
Ega23 ©   (2011-01-19 16:49) [11]


> Если только 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;


 
Rouse_ ©   (2011-01-19 16:50) [12]

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


 
12 ©   (2011-01-19 17:02) [13]

ну да
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 ^)


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


> 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:33) [15]

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

не охота мне каждый раз писать
> 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:51) [16]


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


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

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

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


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


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

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


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


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


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



Страницы: 1 вся ветка

Текущий архив: 2011.04.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.011 c
15-1294911645
stenfit
2011-01-13 12:40
2011.04.24
работа с zip


15-1294766702
P
2011-01-11 20:25
2011.04.24
Недокументированная QuerySystemInformation


6-1236705655
Alex_C
2009-03-10 20:20
2011.04.24
Переподключится к другому телнет серверу


15-1294349396
Юрий
2011-01-07 00:29
2011.04.24
С днем рождения ! 7 января 2011 пятница


15-1294650746
Palladin
2011-01-10 12:12
2011.04.24
Автоскролл при нажатии на колесо мыши