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

Вниз

try or if   Найти похожие ветки 

 
syte_ser78 ©   (2005-07-20 15:02) [0]

Что правильнее использывать try или if? В смысле

if условие действие
else условие действие

или

try
действие
except
действие
end;

при условии возможности критических ошибок
например
var
a:integer;
...
a:=0,5;


 
Eraser ©   (2005-07-20 15:06) [1]

Встречный вопрос: что лучше for..to..do или if..then..else ?


 
syte_ser78 ©   (2005-07-20 15:07) [2]

Первое цикл. Второе условие.
Для цикла лучше первое.


 
REA   (2005-07-20 15:11) [3]

If быстрее, но может не сработать.

Пример какой то странный...


 
Eraser ©   (2005-07-20 15:11) [4]

syte_ser78 ©   (20.07.05 15:07) [2]

Буду иметь ввиду )
__
По сабжу: первое - оператор условия, второе - блок опознавания/обработки исключительных ситуаций.
Для условия лучше первое, для определения исключений - второе.


 
Eraser ©   (2005-07-20 15:12) [5]

a:integer;
...
a:=0,5;


компилятор материться будет.


 
Alexander Panov ©   (2005-07-20 15:15) [6]

Операции по обработке Exception - довольно длительный процесс.
Кроме этого, блоки try..except..end не предназначены для ветвления программ по условию.
Поэтому используй if и не мучайся сомнениями, а участки кода, в которых потенциально могут возникнуть ошибки, оборачивай в защищенный блокю


 
syte_ser78 ©   (2005-07-20 15:25) [7]

Alexander Panov ©   (20.07.05 15:15) [6]
Ок.
Просто в томто и дело что в моем случае моежет быть либо правильно (что я делаю по траю) либо нет (что по эксепту) Скорость особой роли не играет (операция выполняется по онклику кнопки не чаще 2-3 раз в минуту)


 
evvcom ©   (2005-07-20 15:43) [8]


> моежет быть либо правильно (что я делаю по траю) либо нет
> (что по эксепту)

Если это правильно/неправильно можно определить без генерации исключительной ситуации, то лучше до этого и не доводить и использовать if


 
Гаврила ©   (2005-07-20 15:45) [9]


> [7] syte_ser78 ©   (20.07.05 15:25)
> Alexander Panov ©   (20.07.05 15:15) [6]
> Ок.


одно из самых страшных вещей в программе - сокрытие ошибок, которое часто является следствием понаставленных везде секций Except.
Скорее всего
Если входные данные неверны - надо так и сказать "уважаемый пользователь ,мы глубоко обескуражены. неужели ты не видишь ,что твои данные неверны?"
а вовсе не превратить 0.5 в 0 или в 1, если это должно быть целое.

Классический пример следствия сокрытия ошибок я наблюдал на одной из прошлых работ:
Подключаемся к базе данных ,выводим данные в таблицу.
Возможные ошибки при получении данных (например ,сервер недоступен) блокированы в секции Except

в результате запускаем программу и видим: таблица пуста
а дальше и чеши репу - что случилось - толи действительно нет данных в базе, толи произошла ошиьбка - а  самое интересное - какая именно ошибка???

Так что смотри сам от задачи.
Функция StrToInt может вернуть результат типа Integer, а может не вернуть ничего (поднять исключение) ,и это мудро.
:-))


 
syte_ser78 ©   (2005-07-20 15:49) [10]

Вобщем вот кусок кода. Скорее всего о дествительно глупый.
Нужно полученное число из едита записать в виде Х если оно интежер либо Х,Х если флоат.
...
try
 atr[k].TextString:=strtoint(edit1.Text);
except
 atr[k].TextString:=strtofloat(edit1.Text);  
end;
...


 
Alexander Panov ©   (2005-07-20 15:51) [11]

syte_ser78 ©   (20.07.05 15:49) [10]

if Pos(DecimalSeparator,edit1.Text)>0
 then atr[k].TextString:=strtofloat(edit1.Text)
 else atr[k].TextString:=strtoint(edit1.Text);

;)


 
Eraser ©   (2005-07-20 15:54) [12]

syte_ser78 ©   (20.07.05 15:49) [10]

см. TryStrToInt.


 
PVOzerski ©   (2005-07-20 15:59) [13]

Может, я во что-то не врубился... Если atr[k].TextString - не Variant, внутреннее содержимое которого предполагается парсить на более низком уровне, то хватит  atr[k].TextString:=strtofloat(edit1.Text) - без всяких if или try.


 
msguns ©   (2005-07-20 15:59) [14]

Const // Что писать, если отсутствуют
 NullFlt: double = 0.131313;
 NullInt: integer = 131313;
var
 vFlt: double;
 vInt: integer;
begin
 vFlt := StrToFloatDef(edit1.Text,NullFlt);
 vInt := StrToIntDef(edit1.Text,NullInt);
end;


 
PVOzerski ©   (2005-07-20 16:05) [15]

Ну, в приведенном-то коде в любом разе шло присвоение результата функции одной и той же переменной (или свойству) atr[k].TextString. Это либо что-то с плавающей точкой, либо Variant. Исходя из чего и [13].


 
Anatoly Podgoretsky ©   (2005-07-20 16:07) [16]

syte_ser78 ©   (20.07.05 15:02)  
Что правильние
A := 10 или ShowMessage(S)

syte_ser78 ©   (20.07.05 15:49) [10]
edit1.Text := "QWERTY"


 
syte_ser78 ©   (2005-07-20 16:11) [17]

Anatoly Podgoretsky ©   (20.07.05 16:07) [16]

> edit1.Text := "QWERTY"

edit1 - ридонли


 
Anatoly Podgoretsky ©   (2005-07-20 16:18) [18]

edit1 и ридонли, не знаешь что компоненты не редактирования?


 
syte_ser78 ©   (2005-07-20 16:21) [19]

Anatoly Podgoretsky ©   (20.07.05 16:18) [18]
Извините, если пересказывать всю программу и говорить почему в некоторых случаях я применил едиты в некоторых лабелы будет очень долго. на вопрос уже ответил msguns


 
Dok_3D ©   (2005-07-20 21:44) [20]

2 Alexander Panov ©   (20.07.05 15:15) [6]
Операции по обработке Exception - довольно длительный процесс.

Саша, я вас умоляю... Это ложь.

Кроме этого, блоки try..except..end не предназначены для ветвления программ по условию.

С этим соглашусь, придуманы другие конструкции для таких вещей. Но по большому счету - почему нет?

2 syte_ser78 ©   (20.07.05 15:02)  
Что правильнее использывать try или if? В смысле

Поверь, в твоем случае - это без разницы. Осознай для себя оба варианта и варьируй ими как тебе вздумается.


 
ki11er   (2005-07-20 22:00) [21]

>Саша, я вас умоляю... Это ложь.
Вы это серьезно? попробуйте замерить время выполнения следующих конструкций и не говорите чепуху.

1. ptr := nil; if ptr <> nil then begin ptr^ := 3; end;
2. ptr := nil; try ptr^ := 3; except end;

Время выполнения различается в десятки, если не в сотни раз.


 
Anatoly Podgoretsky ©   (2005-07-20 22:35) [22]

Да не важно это, он даже до конца не успеет дожать клавишу, как исключение сработает и при том несколько тысяч раз успеет сработать, в надо еще и отжать клавишу.
О времени стоит говорить только в огромных циалах без участия пользователя.


 
ki11er   (2005-07-21 14:58) [23]

>Да не важно это ...
В данном случае, конечно, не важно. Но это еще не повод вводить людей в заблуждение. Лично мое мнение - try...except нужно только там, где действительно нужно (т.е. когда по-другому никак нельзя сделать). Причем, как очень правильно, imho, сказал Гаврила в случае ошибок нужно так или иначе сообщать об этом пользователю, а не тихо делать вид, что все в порядке.


 
syte_ser78 ©   (2005-07-21 16:41) [24]

ki11er   (21.07.05 14:58) [23]

> в случае ошибок нужно так или иначе сообщать об этом
> пользователю, а не тихо делать вид, что все в порядке

:)))
Скажи честно. Галочку в "Мой компьютер/свойства/дополнительно/отчет об ошибках/включить отчет об ошибках"
снял? :)))


 
ki11er   (2005-07-21 17:13) [25]

Скажу честно - нету у меня такой галочки :)


 
syte_ser78 ©   (2005-07-21 17:32) [26]

обшибся радиобатоны там.


 
jack128 ©   (2005-07-21 17:38) [27]

ki11er   (21.07.05 14:58) [23]
Лично мое мнение - try...except нужно только там, где действительно нужно (т.е. когда по-другому никак нельзя сделать).

а вот по моему когда "действительно нужно" и когда "по другому нельзя сделать" - это абсолютно разные вещи. Обоойтись то без исключений можно всегда.

ИМХО, исключения нужно использовать тогда, когда возникает ошибка. А вот что считать ошибкой зависит от условия задачи.
Например: юзер должен ввести число и программа возведет его в квадрат. если юзер ввел НЕ число, то логично поднять исключение.  
Другой пример: если юзер вводит число(код товара) то программа ищет товар в БД, иначе заданная последовательность символов интерпритируется как название нового вида товаров. Тут нету ошибки в логике, потому и нету смысла поднимать исключение, а потом перехватывать его...


 
Alexander Panov ©   (2005-07-21 17:51) [28]

jack128 ©   (21.07.05 17:38) [27]
Обоойтись то без исключений можно всегда.


procedure TMyThread.Execute;
begin
...
FStrHTML := MyTIdHTTP.Get("http://delphimaster.net/view/1-1/");
...
end;


Здесь можно обойтись без обработки ошибок?


 
ki11er   (2005-07-21 17:52) [29]

>Например: юзер должен ввести число и программа возведет его в
>квадрат. если юзер ввел НЕ число, то логично поднять исключение.
Не хочу начинать "священные войны", но для чего здесь исключение?

>Обоойтись то без исключений можно всегда.
Хорошо, перефразирую: Когда обойтись без исключений достаточно сложно. Т.е. когда очень высокий уровень вложенности вызовов и нужно "резко" выйти наверх без трансляции кода ошибки через все N уровней. Во всех остальных случаях считаю, что использовать исключения не стоит. То, что я говорю не относится к Delphi, так как здесь почти все построено на исключениях и они просто навязываются кодеру. Это мое имхо и особо спорить на эту тему я не хочу. Если кому-то нравится пользоваться исключениями - дело ваше.


 
ki11er   (2005-07-21 17:55) [30]

2 Alexander Panov:
Да, это как раз пример "навязывания" о котором я говорил выше. В дэлфи даже файлстрим не удастся открыть без обработки исключений.
Не знаю, хорошо это или плохо. Сам склоняюсь ко второму варианту.


 
Alexander Panov ©   (2005-07-21 17:57) [31]

ki11er   (21.07.05 17:52) [29]
так как здесь почти все построено на исключениях и они просто навязываются кодеру


хм. блин, так и хочется ругнуться.
Это еще откуда взято такое?

ki11er   (21.07.05 17:52) [29]
Во всех остальных случаях считаю, что использовать исключения не стоит


Первый пример в [28].

Второй пример:

Копируется файл на дискетку. в это время пользователь дискетку вынимает.
Действия программы?


 
ki11er   (2005-07-21 18:26) [32]

>хм. блин, так и хочется ругнуться.
>Это еще откуда взято такое?
Ругаться не нужно. Просто откройте исходники стандартных дэлфийных библиотек и посмотрите, можно ли с ними работать, не используя try...except для отлова ошибок.

>Копируется файл на дискетку. в это время пользователь дискетку
>вынимает. Действия программы?
Действия программы:
1. Видит, что не записалось
2. Берет код ошибки или зная, что копирует на флоппи проверяет наличие диска в устройстве
3. Говорит пользователю : Не удалось скопировать, так как кто-то ;-) вытащил диск. Если хотите копировать дальше - верните диск на родину...  И т.д.


 
Alexander Panov ©   (2005-07-21 19:00) [33]

ki11er   (21.07.05 18:26) [32]
1. Видит, что не записалось
2. Берет код ошибки или зная, что копирует на флоппи проверяет наличие диска в устройстве
3. Говорит пользователю : Не удалось скопировать, так как кто-то ;-) вытащил диск. Если хотите копировать дальше - верните диск на родину...  И т.д.


Оставим файлы.

Вот возьми такой пример.

Функция возвращает символ, который находится по определенному адресу в памяти.

Скажи, как ты найдешь ошибку в программе, если подобных функций у тебя не одна?

function test(n: Integer): Char;
var
 p: PChar;
begin
 p := PChar(n);
 Result := p^;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 s: String;
 c: Char;
 n: Integer;
begin
 c := "a";
 s := test(Integer(@c));
 ShowMessage(s);

 n := 10000;
 s := test(n);
 ShowMessage(s);

end;


Ты сам сказал, что надо реагироватьна ошибку и сообщать пользователю.

Среагируй в этом случае?


 
Гаврила ©   (2005-07-21 19:01) [34]


> Если кому-то нравится пользоваться исключениями - дело ваше.


Мне нравится. И даже объясню, почему:
Потому, что в обоих случаях (исключение поднял я ,исключение поднял не я) логика строится одинаково, и мне не нужно писать везде бесконечные секции Except


 
ki11er   (2005-07-21 19:15) [35]

>Вот возьми такой пример. ...
Извините. Нету ни времени, ни желания. Софистика это все ;-)


 
Alexander Panov ©   (2005-07-21 19:21) [36]

ki11er   (21.07.05 19:15) [35]
Софистика, так софистика.

Тогда можно мне сирому ответ по поводу

ki11er   (21.07.05 18:26) [32]
1. Видит, что не записалось


Как программа видит, что не записалось?


 
Alexander Panov ©   (2005-07-21 19:22) [37]

Значимый ответ на пост [36] будет предполагать, возможен ли вообще дальнейший разговор.


 
ANB ©   (2005-07-21 19:47) [38]


> Alexander Panov ©   (21.07.05 19:21) [36]

- при всем моем уважении к исключениям (будь они неладны при работе с ODAC в асинхронном режиме, замучился перехватывать), при FileWrite, если вытащить дискету, исключения все равно не будет. Придется анализить количество записанных байт и ошибку ОС.


 
ki11er   (2005-07-21 19:49) [39]

>Как программа видит, что не записалось?
Это зависит от многих факторов ;-)))
От 1. ОС, 2. От уровня API, которое используется.

В "самом начале" она видит по тем данным, которые прочитались из портов контроллера дисковода ;-)))


 
Alexander Panov ©   (2005-07-21 20:11) [40]

ki11er   (21.07.05 19:49) [39]
ANB ©   (21.07.05 19:47) [38]
Согласен, здесь был несколько неудачный пример.

Что касается примера из [33], то [35] можно считать просто отмазкой(софистикой).



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

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

Наверх




Память: 0.58 MB
Время: 0.029 c
4-1119466233
volser
2005-06-22 22:50
2005.08.14
Помогите кто работал с LVM_SORTGROUPS


1-1122121140
-virus-
2005-07-23 16:19
2005.08.14
OpenGL графика в проектах Delphi (книга)


14-1121898253
Германн
2005-07-21 02:24
2005.08.14
Последний нонешний денёчек


5-1092994745
sirin
2004-08-20 13:39
2005.08.14
expert


14-1122016086
Дмитрий999
2005-07-22 11:08
2005.08.14
Запретить обьявление экземпляра класса