Форум: "Основная";
Текущий архив: 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