![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему нет хинта что 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]так не используется же... а вот убери возбуждение ексепта, тогда и будет не определен, по этой ветке.