Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.04.24;
Скачать: [xml.tar.bz2];

Вниз

Почему нет хинта что 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.004 c
2-1295368393
Ярослав
2011-01-18 19:33
2011.04.24
TStringList + много данных


1-1252509881
CAMITHbIK
2009-09-09 19:24
2011.04.24
TDBCtrlGrid: поведение при загрузке из dll


15-1294499183
RWolf
2011-01-08 18:06
2011.04.24
GhostDoc для Delphi


2-1295432083
Scott Storch
2011-01-19 13:14
2011.04.24
упростить алгоритм TStrings.SetDelimiterText


2-1295595110
HF-Trade
2011-01-21 10:31
2011.04.24
Цвет шрифта и фон заголовков TPageControl в Windows 7 x64





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский