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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.021 c
3-1120805389
dreamse
2005-07-08 10:49
2005.08.14
Проблема в добавлении записи через хранимую процедуру


1-1122025634
Destroyer
2005-07-22 13:47
2005.08.14
Проблема с вызовом переменной из другого юнита.


14-1121935406
Calm
2005-07-21 12:43
2005.08.14
Стандарты оформления документации к ПО, где почитать?


6-1115076223
Algo
2005-05-03 03:23
2005.08.14
Как из программы установить соединение?


1-1122188478
tttyu
2005-07-24 11:01
2005.08.14
как получить текущую позицию ScrollBar а в Richedit?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский