Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

try or if


Страницы:   1 2 3

syte_ser78 ©   (2005-07-20 15:02:00) 

Что правильнее использывать try или if? В смысле

if условие действие
else условие действие

или

try
действие
except
действие
end;

при условии возможности критических ошибок
например
var
a:integer;
...
a:=0,5;


TUser   (2005-07-22 07:35:00) [1]

Это филосовский вопрос. try безусловно лучше в тех случаях, когда не известно, какие именно ошибки могут возникнуть. Особенно, если в процедуре ты взаимодействуешь с чем-то внешним (устройством, файлом, чужими данными и т.д.). if удобен, если ты заранее знаешь, что за ошибка возможна (например, выход индекса за пределы массива).

Скорее правильный вопрос, не что лучше, а где. Вот допустим у тебя есть 'ядро' приложения - там всякие низкоуровневые дела реализованы. Оно когда-то отлажено, и то, что там возникает ошибка, обычно малоинформативно. Там не надо делать try. А вот на уровень выше, там где ты работаешь с конкретными данными, есть смысл записать логи, чтобы потом проеврить, что с этими данными не так. Впрочем, пяткой в грудь себя бить не буду.


Alexander Panov   (2005-07-21 21:57:00) [2]

ki11er   (21.07.05 21:51) [49]

Это консенсус;)


ki11er   (2005-07-21 21:51:00) [3]

Вот кстати, цитата из требований которые я писал для "новобранцев":

5. Сообщения об ошибках ОБЯЗАТЕЛЬНО должны содержать 1. Более-менее понятную пользователю информацию о том, что происходит; 2. Рекомендации пользователю, что он ему делать дальше; 3. !!! Достаточно информации для того, чтобы разработчик программы мог определить по сообщению место ошибки (именно место ошибки, а не место из которого отобразилось сообщение !!!) в коде программы с точностью до строчки.


ANB   (2005-07-21 21:48:00) [4]

Че то не туда заворачиваем. Ну есть внутренние исключения. Для их обработки придумали try except (правда, он не всегда помогает). Есть в этом и плюсы. Например, если открываешь кверю, а в запросе ошибка, то без исключений мне ВСЕГДА придется проверять, а открылась ли она. Если ошибки возможны - я их перехвачу и обработаю. Если ошибки редки и фатальны для дальнейшего исполнения кода - оставлю обработку по умолчанию.
Суть не в этом. Автор сабжа спрашивает : генерить ли исключения специально, чтобы перехватить, или работать по if. Мое мнение - лучше через if. А исключения оставить на фактические ошибки.


Alexander Panov   (2005-07-21 21:43:00) [5]

ki11er   (21.07.05 21:39) [46]
Все ошибки должны обрабатываться. Причем с выдачей максимума информации о возникшей проблеме и с рекомендациями пользователю, что ему делать дальше


Вот с этим абсолютно согласен;)


ki11er   (2005-07-21 21:39:00) [6]

2 Alexander Panov:

>В следующий раз аргументы подбери посерьезнее.
Это ты о чем? Мои аргументы достаточно сильные.

>В 27 утверждалось, что без исключений можно обойтись всегда.
Именно так. По-твоему до тех пор, пока не появились исключения и программирования не было? Для справки: программирование появилось гораздораньше, чем придумали исключения (те исключения о которых здесь идет речь, просьба к словам не цепляться)

>В 29 - Borland навязывает исключения.(...так как здесь почти
>все построено на исключениях и они просто навязываются
>кодеру...)
Да, навязывает. В качестве доказательства обратного попробуй написать программу, которая открывает файлстрим (используя стандартный TFileStream) и корректно обрабатывает ошибки, не используя при этом конструкции try... Если у тебя это получится сделать с той же легкостью, что и с использованием try, то это будет небольшой аргумент в твою пользу. А если серьезно - я уже говорил выше - открой исходники и посмотри. Почти вся обработка ошибок - на исключениях. Поэтому обойтись без них практически невозможно. Разве что писать на голом АПИ. Но зачем тогда Delphi нужен?  ;-)

>Если ki11er считает, что программа должна вылетать по ошибке -
>это его право.
Я так считаю? :-F Почитай мои посты. Или я не по русски пишу...
Говорил, говорю и буду говорить. Все ошибки должны обрабатываться. Причем с выдачей максимума информации о возникшей проблеме и с рекомендациями пользователю, что ему делать дальше.


Eraser   (2005-07-21 20:39:00) [7]

имхо всё должно быть вмеру и к месту (нужному)). Защещённые блоки и ф-я GetLastError не зря придуманы.


Alexander Panov   (2005-07-21 20:36:00) [8]

ANB ©   (21.07.05 20:23) [42]

Спор возник из-за высказываний [27] и [29].

В 27 утверждалось, что без исключений можно обойтись всегда.
В 29 - Borland навязывает исключения.( ...так как здесь почти все построено на исключениях и они просто навязываются кодеру...)

На самом деле каждый сам выбирает, что ему использовать.
Если ki11er считает, что программа должна вылетать по ошибке - это его право.

Я считаю, что пользователь должен иметь возможность самостоятельно завершать программу.

Знаю я одного разработчика, у которого программы вылетает без обработки ошибок.

Программа не один десяток тысяч строк кода. Причем на Си.
Желаю с таким же энтузиазмом повылавливать ошибки, когда выскакивают очень информативные AV.

А флейм действительно ни о чем.


Alexander Panov   (2005-07-21 20:25:00) [9]

ki11er   (21.07.05 20:20) [41]
Ок. Пора с этим заканчивать, а то уже начало переходить в стадию флейма


В следующий раз аргументы подбери посерьезнее.


ANB   (2005-07-21 20:23:00) [10]

Мое ИМХО. Исключения штука полезная, но и пихать их где не попадя я не люблю, так как делфа падает при отладке, если флажек не снять. А если снять - то замучаешься искать какую нибудь всплывшую ошибку. Если что то можно проверить без исключения, то зачем на него нарываться ? Вот в примере автора сабжа ничего не понимаю - если в поле разрешен ввод нецелых чисел - зачем пытаться запихать его в целое ? А если нужно определить, что после запятой ничего нет, так это намного проще делается. Корректность ввода числовых данных в едите еще проще делается - юзаешь rxCurrencyEdit или rxCalcEdit. Там даже калькулятор встроенный есть. Все красиво и удобно.


ki11er   (2005-07-21 20:20:00) [11]

Ок. Пора с этим заканчивать, а то уже начало переходить в стадию флейма ;-) Всем спасибо.


Alexander Panov   (2005-07-21 20:11:00) [12]

ki11er   (21.07.05 19:49) [39]
ANB ©   (21.07.05 19:47) [38]
Согласен, здесь был несколько неудачный пример.

Что касается примера из [33], то [35] можно считать просто отмазкой( софистикой).


ki11er   (2005-07-21 19:49:00) [13]

>Как программа видит, что не записалось?
Это зависит от многих факторов ;-)))
От 1. ОС, 2. От уровня API, которое используется.

В "самом начале" она видит по тем данным, которые прочитались из портов контроллера дисковода ;-)))


ANB   (2005-07-21 19:47:00) [14]


> Alexander Panov ©   (21.07.05 19:21) [36]

- при всем моем уважении к исключениям (будь они неладны при работе с ODAC в асинхронном режиме, замучился перехватывать), при FileWrite, если вытащить дискету, исключения все равно не будет. Придется анализить количество записанных байт и ошибку ОС.


Alexander Panov   (2005-07-21 19:22:00) [15]

Значимый ответ на пост [36] будет предполагать, возможен ли вообще дальнейший разговор.


Alexander Panov   (2005-07-21 19:21:00) [16]

ki11er   (21.07.05 19:15) [35]
Софистика, так софистика.

Тогда можно мне сирому ответ по поводу

ki11er   (21.07.05 18:26) [32]
1. Видит, что не записалось


Как программа видит, что не записалось?


ki11er   (2005-07-21 19:15:00) [17]

>Вот возьми такой пример. ...
Извините. Нету ни времени, ни желания. Софистика это все ;-)


Гаврила   (2005-07-21 19:01:00) [18]


> Если кому-то нравится пользоваться исключениями - дело ваше.


Мне нравится. И даже объясню, почему:
Потому, что в обоих случаях (исключение поднял я ,исключение поднял не я) логика строится одинаково, и мне не нужно писать везде бесконечные секции Except


Alexander Panov   (2005-07-21 19:00:00) [19]

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;


Ты сам сказал, что надо реагироватьна ошибку и сообщать пользователю.

Среагируй в этом случае?


ki11er   (2005-07-21 18:26:00) [20]

>хм. блин, так и хочется ругнуться.
>Это еще откуда взято такое?
Ругаться не нужно. Просто откройте исходники стандартных дэлфийных библиотек и посмотрите, можно ли с ними работать, не используя try...except для отлова ошибок.

>Копируется файл на дискетку. в это время пользователь дискетку
>вынимает. Действия программы?
Действия программы:
1. Видит, что не записалось
2. Берет код ошибки или зная, что копирует на флоппи проверяет наличие диска в устройстве
3. Говорит пользователю : Не удалось скопировать, так как кто-то ;-) вытащил диск. Если хотите копировать дальше - верните диск на родину...  И т.д.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо