![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
if или case
начинающий2 © (2011-07-13 14:04:00)функция возвращает один из трех возможный результатов. нужно написать обработчик результата функции. так возможных результатов только 3 что разумнее всего использовать if или case
начинающий2 (2011-07-13 16:15:00) [41]дело в том, что библиотека с функциями (..., AddRecord, GoToNextRecord, GoToPreviousRecord, ...) - это api для работы c торговой системой, представляет из себя ком-сервер и работать с ней будет не просто тетенька, а программист (все функции должны возвращать целочисленный результат при успешном выполнении и при ошибке). Я же стараюсь придерживаться механизма как в windows api. когда для получения подробных сведений об ошибке необходимо вызывать функцию GetLastError.
sniknik (2011-07-13 15:57:00) [42]> Человек ее вызывает, смотрит, что она возвратила.
"вызывающему человеку" похрену на все твои "изящества" (проверено практикой) у него 2 состояния - работает/не работает. и если не работает то вызывает он поддержку... которая с твоей программой затр... умучается то есть, но ничего не решит.
stas (2011-07-13 15:57:00) [43]Inovet © (13.07.11 15:52) [13]
Почему скрывает?
он выводит - Format(CanNotAddCategoryRecord, [ E.Message]);
Игорь Шевченко (2011-07-13 15:55:00) [44]
> Что вам не нравится, не понятно.
- Не удалось добавить товар, так как Access violation at ...
читать: http://delphikingdom.com/asp/viewitem.asp?catalogid=1392
stas (2011-07-13 15:54:00) [45]начинающий2 (13.07.11 15:32) [10]
except
on E: Exception do MySuperProcedure (E);
Procedure MySuperProcedure (E:EException)
begin
...
end;
sniknik (2011-07-13 15:53:00) [46]> Что вам не нравится, не понятно.
с точки зрения поддержки получив "- Не удалось добавить товар, так как подключение к серверу отсутствует." исправь ситуацию, скажи что делать "чтобы работало"???
а ведь ты перекрыл как раз самое информативное - "нет доступа", "нет сети", "блокирован сокет", и т.д. та самая причина, что нужна, и от чего "подключение отсутствует".
т.е. ты просто сообщаешь об ошибке, как о факте, с тем же успехом можно поставить везде - "операция завершилась ошибкой, т.к. произошла ошибка."... а закрываешь причину из-за чего она произошла.
семь лет расстрела, через день до смерти!
Inovet (2011-07-13 15:52:00) [47]> [12] начинающий2 (13.07.11 15:44)
> Что вам не нравится, не понятно.
Ты скрываешь и теряешь исходное сообщение об ошибке, взамен пишешь нечто, что может совсем не указывать на причину её возникновения. Как потом это поддерживать если ошибка неустойчивая и не повторить в лабораторных условиях, а тётенька по телевону скажет "Рамочка выскочила и на ней чё-то написано - не могу перемиститься"?
начинающий2 (2011-07-13 15:44:00) [48]Или вот, например, функция добавления записи (все функции храняться в DLL библиотеке).
function TConnectionDataModule.AddRecord(GroupId, CategoryId: Integer): Integer;
var
IsProductRecord: Boolean;
begin
IsProductRecord := GroupId <> GROUP_0;
try
if (SocketConnectionStatus <> SCS_CONNECTED) or
not HasConnectedToDatabase then
raise Exception.CreateRes(@COnnectionNotAvailable);
if not GroupIdIsValid(GroupId) then
raise Exception.CreateRes(@InvalidGroupId, [GroupId]);
if not CategoryIdIsValid(CategoryId) then
raise Exception.CreateRes(@InvalidCategoryId, [CategoryId]);
{ ... }
except
on E: Exception do
begin
Result := -1;
if IsProductRecord then
FLastErrorMessage := Format(CanNotAddProductRecord, [E.Message])
else
FLastErrorMessage := Format(CanNotAddCategoryRecord, [E.Message]);
end;
end;
Человек ее вызывает, смотрит, что она возвратила. Если -1, то вызывает из этой же библиотеки функцию GetLastErrorMessage и смотрит текст ошибки. Сообщения при таком механизме получаются такого плана:
- Не удалось добавить товар, так как подключение к серверу отсутствует.
- Не удалось добавить раздел, так как подключение к серверу отсутствует.
- Не удалось добавить товар, так как группа (id = 14) не найдена.
- Не удалось добавить раздел, так как группа (id = 14) не найдена.
- Не удалось добавить товар, так как раздел (id = 17) не найден.
- Не удалось добавить раздел, так как раздел (id = 17) не найден.
Что вам не нравится, не понятно.
SQLEXPRESS (2011-07-13 15:43:00) [49]except
on E:Exception do
begin
E.Message := E.Message + #13#10 + ' поэтому думаю, что нельзя переместиться на следующую запись';
raise;
end;
end;
начинающий2 (2011-07-13 15:32:00) [50]
> Игорь Шевченко © (13.07.11 15:28) [9]
>
>
> > except
> > on E: Exception do
> > begin
>
>
> Уже за одно это надо пускать пулю в лоб тремя очередями
а что не так? я вывожу сообщения вида:
нельзя переместиться на следующую запись, так как [сообщение эксепшена]
Игорь Шевченко (2011-07-13 15:28:00) [51]
> except
> on E: Exception do
> begin
Уже за одно это надо пускать пулю в лоб тремя очередями
stas (2011-07-13 15:27:00) [52]if начинающий2=нчинающий95 then exit;
SQLEXPRESS (2011-07-13 15:06:00) [53]по мне - case. Нагляднее.
SQLEXPRESS (2011-07-13 15:05:00) [54]посмотрите по ctrl+alt+с
case i of
1: ShowMessage( '1');
2: ShowMessage( '2');
3: ShowMessage( '3');
else
ShowMessage( '123');
end;
if i = 1 then ShowMessage( '1') else
if i = 2 then ShowMessage( '2') else
if i = 3 then ShowMessage( '3') else
ShowMessage( '123');
uReestr.pas.146: case i of
0057BCDC 8BC3 mov eax,ebx
0057BCDE 48 dec eax
0057BCDF 7408 jz +$08
0057BCE1 48 dec eax
0057BCE2 7411 jz +$11
0057BCE4 48 dec eax
0057BCE5 741A jz +$1a
0057BCE7 EB24 jmp +$24
uReestr.pas.147: 1: ShowMessage( '1');
0057BCE9 B868BD5700 mov eax,$0057bd68
0057BCEE E8FD9EEBFF call ShowMessage
0057BCF3 EB22 jmp +$22
uReestr.pas.148: 2: ShowMessage( '2');
0057BCF5 B874BD5700 mov eax,$0057bd74
0057BCFA E8F19EEBFF call ShowMessage
0057BCFF EB16 jmp +$16
uReestr.pas.149: 3: ShowMessage( '3');
0057BD01 B880BD5700 mov eax,$0057bd80
0057BD06 E8E59EEBFF call ShowMessage
0057BD0B EB0A jmp +$0a
uReestr.pas.151: ShowMessage( '123');
0057BD0D B88CBD5700 mov eax,$0057bd8c
0057BD12 E8D99EEBFF call ShowMessage
uReestr.pas.154: if i = 1 then ShowMessage( '1') else
0057BD17 83FB01 cmp ebx,$01
0057BD1A 750C jnz +$0c
0057BD1C B868BD5700 mov eax,$0057bd68
0057BD21 E8CA9EEBFF call ShowMessage
0057BD26 EB2C jmp +$2c
uReestr.pas.155: if i = 2 then ShowMessage( '2') else
0057BD28 83FB02 cmp ebx,$02
0057BD2B 750C jnz +$0c
0057BD2D B874BD5700 mov eax,$0057bd74
0057BD32 E8B99EEBFF call ShowMessage
0057BD37 EB1B jmp +$1b
uReestr.pas.156: if i = 3 then ShowMessage( '3') else
0057BD39 83FB03 cmp ebx,$03
0057BD3C 750C jnz +$0c
0057BD3E B880BD5700 mov eax,$0057bd80
0057BD43 E8A89EEBFF call ShowMessage
0057BD48 EB0A jmp +$0a
uReestr.pas.157: ShowMessage( '123');
0057BD4A B88CBD5700 mov eax,$0057bd8c
0057BD4F E89C9EEBFF call ShowMessage
Медвежонок Пятачок (2011-07-13 14:25:00) [55]ты смотрел старый советский фильм "не болит голова у дятла"?
начинающий2 (2011-07-13 14:22:00) [56]спрашиваю потому как где-то слышал что case генерит более оптимальный код.
начинающий2 (2011-07-13 14:16:00) [57]что значил узкое место, во код:
какой вариает лучше
function TConnectionDataModule.GoToNext: Integer;
begin
try
except
on E: Exception do
begin
Result := -1;
if FRecordsGroup = RG_PRODUCTS then
FLastErrorMessage := Format(CannotGoToNextProductRecord, [E.Message])
else
if FRecordsGroup = RG_CATEGORIES then
FLastErrorMessage = Format(CannotGoToNextCategoryRecord, [E.Message])
else
FLastErrorMessage := Format(CannotGoToNextRecord, [E.Message]);
end;
end;
end;
function TConnectionDataModule.GoToNext: Integer;
begin
try
except
on E: Exception do
begin
Result := -1;
case FRecordsGroup of
RG_PRODUCTS: FLastErrorMessage := Format(CannotGoToNextProductRecord,
[E.Message]);
RG_CATEGORIES: FLastErrorMessage := Format(CannotGoToNextCategoryRecord,
[E.Message]);
else
FLastErrorMessage := Format(CannotGoToNextRecord, [E.Message]);
end;
end;
end;
end;
Сергей М. (2011-07-13 14:12:00) [58]А если узкое, то выбирай более оптимальный с т.з. компилятора вариант.
Омлет (2011-07-13 14:08:00) [59]Если это не узкое место, то выбирай более читабельный вариант.