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

Вниз

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

Наверх





Память: 0.51 MB
Время: 0.042 c
15-1157549352
Новый_Юзер
2006-09-06 17:29
2006.10.08
как заменить картинку при загрузке WindowsXP?


8-1141039800
Новенький
2006-02-27 14:30
2006.10.08
Audio Capture


2-1158521523
Aleksandr
2006-09-17 23:32
2006.10.08
Delphi7 и html


15-1158580296
гастрит
2006-09-18 15:51
2006.10.08
форма


2-1158653226
pathfinder
2006-09-19 12:07
2006.10.08
Вопрос по интернет-компонентам.





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