Текущий архив: 2011.11.06;
Скачать: CL | DM;
Вниз
if или case Найти похожие ветки
← →
начинающий2 (2011-07-13 14:04) [0]функция возвращает один из трех возможный результатов. нужно написать обработчик результата функции. так возможных результатов только 3 что разумнее всего использовать if или case
← →
Омлет © (2011-07-13 14:08) [1]Если это не узкое место, то выбирай более читабельный вариант.
← →
Сергей М. © (2011-07-13 14:12) [2]А если узкое, то выбирай более оптимальный с т.з. компилятора вариант.
← →
начинающий2 (2011-07-13 14:16) [3]что значил узкое место, во код:
какой вариает лучше
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;
← →
начинающий2 (2011-07-13 14:22) [4]спрашиваю потому как где-то слышал что case генерит более оптимальный код.
← →
Медвежонок Пятачок © (2011-07-13 14:25) [5]ты смотрел старый советский фильм "не болит голова у дятла"?
← →
SQLEXPRESS (2011-07-13 15:05) [6]посмотрите по 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
← →
SQLEXPRESS (2011-07-13 15:06) [7]по мне - case. Нагляднее.
← →
stas © (2011-07-13 15:27) [8]if начинающий2=нчинающий95 then exit;
← →
Игорь Шевченко © (2011-07-13 15:28) [9]
> except
> on E: Exception do
> begin
Уже за одно это надо пускать пулю в лоб тремя очередями
← →
начинающий2 (2011-07-13 15:32) [10]
> Игорь Шевченко © (13.07.11 15:28) [9]
>
>
> > except
> > on E: Exception do
> > begin
>
>
> Уже за одно это надо пускать пулю в лоб тремя очередями
а что не так? я вывожу сообщения вида:
нельзя переместиться на следующую запись, так как [сообщение эксепшена]
← →
SQLEXPRESS (2011-07-13 15:43) [11]except
on E:Exception do
begin
E.Message := E.Message + #13#10 + " поэтому думаю, что нельзя переместиться на следующую запись";
raise;
end;
end;
← →
начинающий2 (2011-07-13 15:44) [12]Или вот, например, функция добавления записи (все функции храняться в 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) не найден.
Что вам не нравится, не понятно.
← →
Inovet © (2011-07-13 15:52) [13]> [12] начинающий2 (13.07.11 15:44)
> Что вам не нравится, не понятно.
Ты скрываешь и теряешь исходное сообщение об ошибке, взамен пишешь нечто, что может совсем не указывать на причину её возникновения. Как потом это поддерживать если ошибка неустойчивая и не повторить в лабораторных условиях, а тётенька по телевону скажет "Рамочка выскочила и на ней чё-то написано - не могу перемиститься"?
← →
sniknik © (2011-07-13 15:53) [14]> Что вам не нравится, не понятно.
с точки зрения поддержки получив "- Не удалось добавить товар, так как подключение к серверу отсутствует." исправь ситуацию, скажи что делать "чтобы работало"???
а ведь ты перекрыл как раз самое информативное - "нет доступа", "нет сети", "блокирован сокет", и т.д. та самая причина, что нужна, и от чего "подключение отсутствует".
т.е. ты просто сообщаешь об ошибке, как о факте, с тем же успехом можно поставить везде - "операция завершилась ошибкой, т.к. произошла ошибка."... а закрываешь причину из-за чего она произошла.
семь лет расстрела, через день до смерти!
← →
stas © (2011-07-13 15:54) [15]начинающий2 (13.07.11 15:32) [10]
except
on E: Exception do MySuperProcedure (E);Procedure MySuperProcedure (E:EException)
begin
...
end;
← →
Игорь Шевченко © (2011-07-13 15:55) [16]
> Что вам не нравится, не понятно.
- Не удалось добавить товар, так как Access violation at ...
читать: http://delphikingdom.com/asp/viewitem.asp?catalogid=1392
← →
stas © (2011-07-13 15:57) [17]Inovet © (13.07.11 15:52) [13]
Почему скрывает?
он выводит - Format(CanNotAddCategoryRecord, [E.Message]);
← →
sniknik © (2011-07-13 15:57) [18]> Человек ее вызывает, смотрит, что она возвратила.
"вызывающему человеку" похрену на все твои "изящества" (проверено практикой) у него 2 состояния - работает/не работает. и если не работает то вызывает он поддержку... которая с твоей программой затр... умучается то есть, но ничего не решит.
← →
начинающий2 (2011-07-13 16:15) [19]дело в том, что библиотека с функциями (..., AddRecord, GoToNextRecord, GoToPreviousRecord, ...) - это api для работы c торговой системой, представляет из себя ком-сервер и работать с ней будет не просто тетенька, а программист (все функции должны возвращать целочисленный результат при успешном выполнении и при ошибке). Я же стараюсь придерживаться механизма как в windows api. когда для получения подробных сведений об ошибке необходимо вызывать функцию GetLastError.
← →
Медвежонок Пятачок © (2011-07-13 16:27) [20]тогда ты не нужен, если будет работать программист.
← →
Сергей М. © (2011-07-13 16:31) [21]
> не просто тетенька, а программист
В смысле что-то бесполое ?)
← →
stas © (2011-07-13 16:38) [22]начинающий2 (13.07.11 16:15) [19]
ИспользуйCase
и не парься ))
← →
Юрий Зотов © (2011-07-13 16:42) [23]> начинающий2 (13.07.11 14:04)
> что разумнее всего использовать if или case
Ни то, ни другое.
1. Делаем такие объявления:
type
TRG = (RG_PRODUCTS, RG_CATEGORIES, ...); // тип результата FRecordsGroup
const
ErrMsg: array[TRG] of string =
(CannotGoToNextProductRecord, CannotGoToNextCategoryRecord, ...);
2. И теперь не нужны ни if, ни case - все стало просто и коротко:
on E: Exception do
begin
Result := -1;
FLastErrorMessage := Format(ErrMsg[FRecordsGroup], [E.Message]);
end;
← →
Rouse_ © (2011-07-13 19:15) [24]
> Игорь Шевченко © (13.07.11 15:28) [9]
> Уже за одно это надо пускать пулю в лоб тремя очередями
Правильно - и в первую очередь в лоб всем разработчикам VCL, или отказаться от использования оного...
зы: воть на вскидку из генофонда:except
on E: Exception do
Text := SBCDOverflow;
end;
← →
KilkennyCat © (2011-07-14 03:12) [25]генофонд уже давно не пример для подражания...
А на мой взгляд, в большинстве случаев, писать надо просто безглючно и удобно, базируясь на имеющихся знаниях (если их достаточно). Процессоры сейчас мощные, винчестеры большие. Заказчик интересуется лишь конечным результатом, за который и платит. Оплата позволяет некоторое время жить. Так что, если влияние на результат пренебрежимо мало, можно вместо цикла копи-пасте забабахать, а уж потом, на полученные средства купить книжку и почитать про циклы. Если же сначала купить книжку и прочитать про циклы, то прибыль меньше.
← →
Dennis I. Komarov © (2011-07-14 08:52) [26]
> Игорь Шевченко © (13.07.11 15:28) [9]
>
> > except
> > on E: Exception do
> > begin
>
>
> Уже за одно это надо пускать пулю в лоб тремя очередями
НЕ согласен. Софт, работает 24/7. Ну не надо мне видеть (особенно когда некому) исключения на экране, все в лог сваливается. Так за что сразу к стенке?
← →
SQLEXPRESS (2011-07-14 09:04) [27]
> Софт, работает 24/7.
тогда к программе с такими конструкциями
except
on E:Exception do
begin
E.Message := E.Message + #13#10 + " поэтому думаю, что нельзя переместиться на следующую запись";
raise;
end;
end;
просто добавляем ApplicationEvents, где на onError все пишем в фал
а если потребуется смотреть реальные ошибки,
тогда просто достаточно один метод убрать/обойти, а не лазить по всему тексту, вставляя Raise везде, где спрятал
← →
Dennis I. Komarov © (2011-07-14 10:12) [28]
> SQLEXPRESS (14.07.11 09:04) [27]
Не надо передергивать. Вопрос был за что к стенке при:except
?
on E: Exception do begin
> просто добавляем ApplicationEvents,
Куда?
> а не лазить по всему тексту, вставляя Raise везде, где спрятал
Все что спрятал отправил в лог...
← →
SQLEXPRESS (2011-07-14 11:25) [29]
> Не надо передергивать. Вопрос был за что к стенке при:
> except
> on E: Exception do begin?
Дэн, читай все. Стрелять за
except
on E: Exception do
begin
ToLog(E);
ToBuffer(E);
ToXXX(E);
end;
без перевозбуждения если. :)
> а не лазить по всему тексту, вставляя Raise везде, где спрятал
> Все что спрятал отправил в лог...
Твой код используют, он проглотил ошибку.
Пока еще разберутся, куда он что логгирует, проклянут 3 раза.
> > просто добавляем ApplicationEvents,
> Куда?
Вот. Куда - решит тот, кто использует.
Если это гуй - то на форму, если нет, то породит что-то в реал-тайме и привяжет.
Используя чужой код, ожидаешь от него реальную ошибку. А что с ней делать - решает обработчик выше.
Если это твой обработчик(для себя пишешь), пишешь в лог.
т.е.
если надо не стопорить приложение,
то твой обработчик самого последнего, верхнего уровня может писать в лог и гасить ошибку.
но
если его убрать,
то что бы все ошибки остались не обработанными.
А
если ты их неперевозбуждаешь,
то придется по коду лазить.
Вот ты уволился, дай бог в Газпром ушел :), твой код отдали следующему.
Он решил что-то доработать, вызвал твою функцию, она съела ошибку, он гадает, что же там такое.
vs
он отменил твой обработчик верхний, и сам получает все ошибки.
Что с ними делать - сам решает.
и ставит один свой верхний, если их опять надо гасить
← →
Игорь Шевченко © (2011-07-14 11:37) [30]Rouse_ © (13.07.11 19:15) [24]
Dennis I. Komarov © (14.07.11 08:52) [26]
> НЕ согласен.
Для несогласных дана ссылка на статью, читайте и воздастся
← →
Dennis I. Komarov © (2011-07-14 12:06) [31]
> Дэн, читай все. Стрелять за
А я про [9] и только. Ибо к коду [3] и т.п. не имею никакого...
> Вот. Куда - решит тот, кто использует.
> Если это гуй - то на форму, если нет, то породит что-то
> в реал-тайме и привяжет.
> Используя чужой код, ожидаешь от него реальную ошибку. А
> что с ней делать - решает обработчик выше.
> Если это твой обработчик(для себя пишешь), пишешь в лог.
>
А вот нету даже TApplication :P
З.Ы. Так стоило быть на столько категоричним???
> Игорь Шевченко © (14.07.11 11:37) [30]
Не конструктивно, слишком много букв... Суть где?
З.Ы.Ы.
Я ниразу не ЗА, чтоб ошибки прятали за своим "красивым" текстом...
← →
SQLEXPRESS (2011-07-14 12:50) [32]
> А вот нету даже TApplication :P
Джедаи помогут :)
(даже с № строки и текстом оператора ошибку покажут)
> З.Ы. Так стоило быть на столько категоричним???
Наверное, нет :)
> Я ниразу не ЗА, чтоб ошибки прятали за своим "красивым"
> текстом...
да это понятно..
я, напрмер, устал гадать.
как же надоело подключаться к юзерам и видеть надпись "Ошибка! Обратитесь разработчику"
Человек, писавший ее, безусловно, рубил в предмете, но как же напрягает после часового просмотра трейса всяких xxxMonitir от SysInternals, обнаружить, что она пробует в монопольном режиме открыть файл,
или писать в порт,
обламывается и вот так вот говорит об этом.
← →
Игорь Шевченко © (2011-07-14 13:28) [33]Dennis I. Komarov © (14.07.11 12:06) [31]
> Не конструктивно, слишком много букв...
Статья полезная, претензии по объему - к автору. Суть в статье.
← →
sniknik © (2011-07-14 16:06) [34]> Человек, писавший ее, безусловно, рубил в предмете
да ламер он, тот кто "рубит", имеет опыт ("книжное" "рубление" это немного не то) никогда так не напишет.
← →
Rouse_ © (2011-07-14 16:07) [35]
> Игорь Шевченко © (14.07.11 11:37) [30]
> Для несогласных дана ссылка на статью, читайте и воздастся
Для несогласных есть QualityCentral где ты совершенно спокойно можешь отписаться о багах в коде VCL и прикрепить линк на статью :)
← →
sniknik © (2011-07-14 16:11) [36]> "книжное" "рубление" это немного не то
можно прочитать кучу книг, и даже все, что там есть хорошо выучить, знать, но не использовать в работе... просто потому что не сталкивался/не воспринимаешь всерьез последствия.
← →
SQLEXPRESS (2011-07-14 16:32) [37]
> sniknik © (14.07.11 16:06) [34]
не, я имел ввиду немного другое
то что он знал, что если тут такая цифра а тут такая, то тут должна быть такая
Это правила предметной области, он тут спец.
т.е. он формализовал и алгоритмизировал то, что не каждый бы не смог.
А вот как это реализовал - да :)
это оставляет желать лучшего
← →
SQLEXPRESS (2011-07-14 16:34) [38]
> что не каждый бы не смог.
прямо по Фрейду :)
следует читать: * не каждый бы смог такое на алгоритм положить
← →
Dennis I. Komarov © (2011-07-14 17:26) [39]
> то что он знал, что если тут такая цифра а тут такая, то
> тут должна быть такая
> Это правила предметной области, он тут спец.
Что-то там не заметно, что он генерировал собственные исключения...
← →
SQLEXPRESS (2011-07-14 17:28) [40]
> Что-то там не заметно, что он генерировал собственные исключения.
> "Ошибка! Обратитесь разработчику"
except
тут что-то проверяет, пытается выкрутится
и если не выкрутились то ShowMessage
end;
Страницы: 1 2 вся ветка
Текущий архив: 2011.11.06;
Скачать: CL | DM;
Память: 0.59 MB
Время: 0.007 c