Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.051 c
3-1154678271
jiny
2006-08-04 11:57
2006.10.08
Права пользователей в программе


2-1158912710
RomanH
2006-09-22 12:11
2006.10.08
IncludeTrailingBackslash


15-1158176108
Ne-Lud
2006-09-13 23:35
2006.10.08
ACM олимпиады. Какова от них польза?


2-1158734167
stfu
2006-09-20 10:36
2006.10.08
Проблема с вставкой текста на русском в xls(Excel)


2-1158403002
Id
2006-09-16 14:36
2006.10.08
Динамический запуск формы