Текущий архив: 2006.10.08;
Скачать: CL | DM;
Внизtry ... except аки заглушка Найти похожие ветки
← →
AntiUser © (2006-09-18 19:49) [0]Вот мастера говорят, что использование этой конструкции для глушения ошибки не есть хорошо и я с этим полностью согласен, к тому же никогда их так не использовал, но вот возникла проблема/не проблема при которой (как мне кажется) без этого не обойтись. Рассудите, объясните.
for i := 0 to ValueCount -1 do begin
if Value = "SomeString" then
...
end;
Дело в том, что Value возвращает Variant, но в цикле может попасться Value NULL. В справке написано:
Variant type conversion rules
________integer___________real_____________string__________Boolean
Null raises exception raises exception raises exception raises exception
Отсюда возникает exception. Может я неправильно сравниваю?
← →
Ega23 © (2006-09-18 19:50) [1]Проверяй на VarType(Value)=varNull
← →
Eraser © (2006-09-18 19:56) [2]> [0] AntiUser © (18.09.06 19:49)
NullStrictConvert + F1
← →
AntiUser © (2006-09-18 19:59) [3]Т.е.
if (VarType(Value[i])<>varNull) and (Value[i] = "SomeString") then
Правильно я понял?
← →
Карелин Артем © (2006-09-18 20:18) [4]
> AntiUser © (18.09.06 19:59) [3]
Ты уповаешь на то, что компиллятор отбросит второе, если первое ложь?
← →
Piter © (2006-09-18 20:32) [5]>Вот мастера говорят, что использование этой конструкции для глушения
>ошибки не есть хорошо
это с каких пор try..except использование не есть хорошо?!?!
И какие такие мастера это говорят?!
>Ты уповаешь на то, что компиллятор отбросит второе, если первое ложь?
ну по-умолчанию так оно и будет :)
Ну можно специально флаг выставить.
Хотя я обычно пишу двойной "if" чтобы однозначно было.
← →
DillerXX © (2006-09-18 20:34) [6]VarIsNull() вот так ещё можно, очень удобно.
> Ты уповаешь на то, что компиллятор отбросит второе, если
> первое ложь?
Именно так он и сделает.
Кстати, приведите пример где действительно невозможно обойтись без try .. except, а то что-то в голову сходу не приходит ничего
← →
AntiUser © (2006-09-18 20:35) [7]Piter © (18.09.06 20:32) [5]
это с каких пор try..except использование не есть хорошо?!?!
Это не хорошо, если except ... end; пустой
← →
cyborg © (2006-09-18 20:37) [8]> [6] DillerXX © (18.09.06 20:34)
Ну я использую при конвертировании строки в числео из едита.
try
f:=FloatToInt(memo.text);
except
f:=0;
end;
← →
cyborg © (2006-09-18 20:37) [9]> [8] cyborg © (18.09.06 20:37)
Пардон StrToFloat
← →
AntiUser © (2006-09-18 20:41) [10]А вот Eraser"a пример мне больше по душе ;)
← →
Virgo_Style © (2006-09-18 20:41) [11]cyborg © (18.09.06 20:37) [8]
TryStrToInt, StrToIntDef в вашей версии Delphi еще нет?
P.S. Внутри них - Val() %-)
← →
cyborg © (2006-09-18 20:43) [12]> [11] Virgo_Style © (18.09.06 20:41)
Не знаю.
← →
DillerXX © (2006-09-18 20:44) [13]
> TryStrToInt
Во как, век живи век ...
Тогда где ещё нельзя обойтись без обработки другие предложения :)
← →
cyborg © (2006-09-18 20:46) [14]Virgo_Style Для чисел с запятой подскажи?
← →
DillerXX © (2006-09-18 20:47) [15]
> Virgo_Style Для чисел с запятой подскажи?
TryStrToFloat(), нет?
← →
cyborg © (2006-09-18 20:48) [16]Всё, в справке посмотрел у Val
V is an integer-type or real-type variable.
← →
cyborg © (2006-09-18 20:49) [17]Чего-то Val не доводилось никогда использовать :)
← →
Kolan © (2006-09-18 22:11) [18]А я часто использую при написании формул:
Result := NAN;
try
Result := Sqrt(A/B);
except
end;
Я не прав? А как надо? Проверять всевозможные условия долго и громоздко...
← →
Anatoly Podgoretsky © (2006-09-18 22:13) [19]
try
Result := Sqrt(A/B);
except
Result := NAN;
end;
← →
Kolan © (2006-09-18 22:19) [20]
> Anatoly Podgoretsky © (18.09.06 22:13) [19]
Буратино эро ступпидо... Это я про себя :) Благодарю...
← →
guav © (2006-09-18 22:35) [21]
xSave := SetExceptionMask([exInvalidOp, exZeroDivide]);
try
Result := Sqrt(A/B);
finally
SetExceptionMask(xSave);
end;
← →
Слон © (2006-09-18 23:21) [22]однажды вынужден был использовать try-catch (c#). при вызове ODBCCommand.ExecuteNonQuery весьма специфичная БД с древним одбц-драйвером упорно вылезало исключение, что драйвер данную функцию не поддерживает.
при этом запрос вполне работал - и инсертилось, и делетилось. поставил заглушку - проблема исчезла.
чёрт знает, сколько времени с тех пор прошло, но по-прежнему это помню, и слегка стыдно вспоминать об этом =)
← →
jack128 © (2006-09-19 01:09) [23]guav © (18.09.06 22:35) [21]
это не эквивалентно коду [18] и [19]
INF <> NAN ;-)
← →
Германн © (2006-09-19 01:28) [24]
> try ... except аки заглушка
Такое использование есть моветон, но не запрещено!
Но при использовании такой заглушки нужно быть уверенным полностью в том, что знаешь какие исключения могут возникнуть в защищенном блоке и в том, что никакие из них не приведут к неработоспособности программы!
← →
guav © (2006-09-19 02:02) [25][23] jack128 © (19.09.06 01:09)
> это не эквивалентно коду [18] и [19]
> INF <> NAN ;-)
То что не эквивалентно я знаю - такой код лучше :-), т.к. не поднимается лишнее исключение и не ловятся неожиданные исключения.
Я показал только идею и не старался написать эквивалентный код.
Если хочется можноif IsInfinity(Result) then Result := NAN;
.
← →
ИА (2006-09-19 05:33) [26]>Слон © (18.09.06 23:21) [22]
>однажды вынужден был использовать try-catch (c#).
В программировании практически нет ситуаций "всегда делать так а не иначе". На любое правило найдется исключение из него.
Страницы: 1 вся ветка
Текущий архив: 2006.10.08;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.042 c