Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.02;
Скачать: CL | DM;

Вниз

Exceptions considered harmful ?   Найти похожие ветки 

 
ketmar ©   (2008-01-25 20:57) [40]

>[33] Черный Шаман (25.01.08 20:32)
думай дальше. то-то ваш код рушится.

по какому праву ты ловишь ВСЕ исключения, и никому больше их не отдаёшь? лови свои, которые ожидаешь. остальные не замай — не твоё.

>[34] Kolan©(25.01.08 20:34)
да. баг из DNA просочился в софт.

ты мне сейчас доказываешь, что ошибочное поведение программы — это такая штатная фича. помедитируй в свободное время над словами «исключительная ситуация».

>[36] Kolan©(25.01.08 20:38)
вполне. если goto применён разумно. я в Си, например, частенько готой пользуюсь, и ничего. никаких проблем.


 
Черный Шаман   (2008-01-25 21:07) [41]


> ketmar ©   (25.01.08 20:57) [40]


Если бы вы не знали как сложно разработать программу нормально функционирующую от NT до Vista, причём 64-битной с 32-битным кодом, то редкие глюки бы вас не волновали.


> по какому праву ты ловишь ВСЕ исключения, и никому больше
> их не отдаёшь? лови свои, которые ожидаешь. остальные не
> замай — не твоё.


А кто их ловить должен, пользователь? Если мне все равно отчего система не открыла данный PIDL, она просто его не открыла и кинула екзепшен, то зачем пользователю указывать эту информацию? Кроме того программа должна работать даже на убитой твикерами винде, что порождает множество ситуаций тоесть NP-полную задачу.


 
Игорь Шевченко ©   (2008-01-25 21:26) [42]

Kolan ©   (25.01.08 19:29) [13]


> Что скажите по поводу рефакторинга Replace Error Code with
> Exception?


Марксизм не догма, а руководство к действию.


> Послание эксепшена это нормальная реакция программы.


Чтоб тебе всю оставшуюся жизнь отлаживать чужую программу в миллион строк, написанную с этой позиции.


 
Kolan ©   (2008-01-25 21:29) [43]

> помедитируй в свободное время над словами «исключительная
> ситуация».

А ты над словом баг. И тем, что «исключительная» уже значит, что ты об ней думал.


> да. баг из DNA просочился в софт.

Ага, а если убрал, то и бага нет, да? Сколько же в VCL багов, нодо все эксепшены стереть и багов не будет&#133 Моё то ДНК в порядке, а твоё?


 
Игорь Шевченко ©   (2008-01-25 21:46) [44]

ketmar ©   (25.01.08 20:57) [40]


> если goto применён разумно. я в Си, например, частенько
> готой пользуюсь, и ничего. никаких проблем.


Всякий овощ приносит пользу, будучи употреблен надлежащим образом в надлежащее время :)


 
Kerk ©   (2008-01-25 22:29) [45]

Для кетмара :)

begin
 select Field1 into Var1 from Table where Field2 = Var2
exception
 when no_data_found then Var1 := 123;
end;


Тут есть эксепшн, но нет бага. Помедитируй :)


 
Игорь Шевченко ©   (2008-01-25 22:58) [46]

Kerk ©   (25.01.08 22:29) [45]

select nvl(max(Field1),123) into var1 from table where Field2 = Var2;

? :)


 
Kerk ©   (2008-01-25 23:01) [47]


> Игорь Шевченко ©   (25.01.08 22:58) [46]

Ага. Меня на работе заставляют использовать этот вариант
Но он мне противен, ибо поглощает ошибку too_many_rows


 
guav ©   (2008-01-25 23:13) [48]

> [1] Игорь Шевченко ©   (25.01.08 16:44)

Я понимаю, что

> Exception handlers should not be used to redirect the program"s
> normal flow of control.

Т.е. нормальная работа - последовательное выполнение операторов. Но если файл не открылся, пользователь не ввёл данные, или ещё что-то не так, то требуется прервать нормальное выполнение программы.
"overflow of an array boundary" - это вообще ошибка в самой программе. В Delphi используются исключения в подобных случаях. Вот я и не понял какие это "unusual or unanticipated program events", если даже "overflow of an array boundary" туда не попадает.

Остановку отладчика на исключениях можно и отключить.


> [12] ketmar ©   (25.01.08 18:53)
> нет, их стандартная библиотека, зараза, использует.

Ну так... главное преимущество искючений перед HRESULT: "An exception cannot be ignored".


> [15] Черный Шаман   (25.01.08 19:49)


> Простое правило если тебе в функцию передали запрос на объект
> массива то проверь на диапазон.

см. [7] DiamondShark ©   (25.01.08 17:20)
Допустим, для какого-то случая правило оказалось приемлемо, вставили проверку.
Что должна функция вернуть, если данные не проходят проверку ?
Если эта функция вызывается другой функцией (которая тоже именно функция), должна ли вызывающая функция проверять результат на значение-при-ошибке-диапазона, и что должна возвращать она тогда, другое "значение-при-ошибке-диапазона" ?
Да, конечно, если функции будут "не совсем функциями", а будут принимать var параметр, можно воспользоватся кодом типа HRESULT. но тогда "функции будут не совсем функциями".

> вставить лог для отслеживания

Для отслеживания действительно надо использовать лог. вопрос в том, как обработать ошибку.


> [22] DiamondShark ©   (25.01.08 20:06)
> А вообще, чего только не considered harmful.
> И наследование объявляли, и ООП вообще, и гото, и циклы...

Я понимаю, что всё названное considered harmful, но сейчас меня больше беспокоят исключения.


 
oxffff ©   (2008-01-25 23:26) [49]


> guav ©   (25.01.08 16:39)  


А чего не понятно?

-Because of the nature of exception handling and the extra overhead involved, exceptions should be used only to signal the occurrence of unusual or unanticipated program events.
-exception should not be thrown in cases of potential logic or user input errors

С чем не согласен?
Не следует злоупотреблять исключениями, но и без них нельзя обойтись.
Где написано что исключение - ЗЛО?


 
Труп Васи Доброго ©   (2008-01-25 23:36) [50]

Читаю и поражаюсь - какие все умные!!!! Правда, я завидую! Какие слова вы знаете!!!
ИМХО это очередной холивар. Кому нравится - используют, кому не нравятся - не используют. Я в своих поделках стараюсь никогда не употреблять слово exception, ибо оно говорит мне что я не учёл какой то вариант развития событий, а для меня сие в раздражение.


 
b z   (2008-01-25 23:54) [51]


> clickmaker ©   (25.01.08 16:48) [2]
> Так ведь нет! Он кидает ArgumentException
> нахрена...

Есть предположение, что Ordinal = -1 в случае, когда сама колонка отвязана от таблицы. А вот IndexOf работает в "подвязанной" к таблице колекции. Наверное можно былобы не смотреть на это, но разработчики решии так, я так думаю.


 
guav ©   (2008-01-25 23:56) [52]

> [49] oxffff ©   (25.01.08 23:26)

"extra overhead involved" обычно не повод для беспокойства, тем более если кидать их при "potential logic or user input errors".

Вообще сначала упоминание оверхеда, потом утверждение, что исключения не используются для управления в нормальных ситуациях, потом несколько ненормальных ситуаций в качестве примера норамльных, когда не бросают исключения, и затем призыв к рассудительному использованию исключений - это похоже на попытку без внятной аргументации убедить не использовать исключения.


> С чем не согласен?

С "exception should not be thrown in cases of potential logic or user input errors".


> без них нельзя обойтись.

Ну это преувеличение.
Обойтись можно и без исключений, и без наследования, и без ООП, и без goto.


 
oxffff ©   (2008-01-26 00:02) [53]


> Ну это преувеличение.
> Обойтись можно и без исключений, и без наследования, и без
> ООП, и без goto.


Приведи код в студию как собираешься обходить следующие исключения
(не обращай внимания что это исключения процессора).

0 Divide Error
1 Debug Exception
2 NMI Interrupt
3 Breakpoint
4 INTO-detected Overflow
5 BOUND Range Exceeded
6 Invalid Opcode
7 Device Not Available
8 Double Fault
9 CoProcessor Segment Overrun (reserved)
10 Invalid Task State Segment
11 Segment Not Present
12 Stack Fault
13 General Protection
14 Page Fault
15 (Intel reserved. Do not use.)
16 Floating-Point Error
17 Alignment Check
18 Machine Check*
19-31 (Intel reserved. Do not use.)
32-255 Maskable Interrupts


 
Игорь Шевченко ©   (2008-01-26 00:03) [54]

Kerk ©   (25.01.08 23:01) [47]

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

Мне лично вариант, который с NVL(MAX(...)) совершенно не читаем и неочевиден, но...короче, зараза, по строчкам :)

guav ©   (25.01.08 23:13) [48]


> Т.е. нормальная работа - последовательное выполнение операторов.
>  Но если файл не открылся, пользователь не ввёл данные,
> или ещё что-то не так, то требуется прервать нормальное
> выполнение программы.


Безусловно, последовательное выполнение операторов. В том числе и условных. Это намек такой.

То есть, если файл не открылся, и предусмотрен набор действий по его неоткрытию, вполне подходит условный оператор.
Нормальное выполнение программы может прерываться в случае непредусмотренных алогритмом ситуаций.
Я так думаю (с)


> Остановку отладчика на исключениях можно и отключить.


Нельзя. Потому что исключения тоже надо ловить при отладке и смотреть, где и отчего они возникают. Но если при этом, нажимая F8 на вызове функции, я ожидаю, что перейду на следующую строку программы, а вместо этого отладчик останавливается в неведомой глубине, потому что там возникло исключение (которое тут же рядом и обрабатывается) и я уже потерял место, где нажимал F8, то автору такого кода икаться будет очень долго.


 
oxffff ©   (2008-01-26 00:07) [55]


> > С чем не согласен?
>
> С "exception should not be thrown in cases of potential
> logic or user input errors".


Генерировать исключения не следует в случаях гарантированной возможности детерминировано установить потенциальную ошибку.
И вернуть ее в качестве информативного fail результата.


 
oxffff ©   (2008-01-26 00:14) [56]


> oxffff ©   (26.01.08 00:07) [55]
>
> > > С чем не согласен?
> >
> > С "exception should not be thrown in cases of potential
>
> > logic or user input errors".
>
>
> Генерировать исключения не следует в случаях гарантированной
> возможности детерминировано установить потенциальную ошибку.
>
> И вернуть ее в качестве информативного fail результата.


Однако никто не запрещает игнорировать это правило.
И генерировать псевдо исключения (изменяющие рабочий поток инструкций) в качестве способа передачи управления.
Однако такой способ приводит к extra overhead.


 
guav ©   (2008-01-26 00:31) [57]

> [53] oxffff ©   (26.01.08 00:02)

Причём тут прерывание процессора ? Если речь идёт о том, что они мапятся в SEH Windows, так есть программы которые их не обрабатывают. Никак. Просто если SEH исключение из Windows попало в программу, и программа этого не ожидала, то в програме ошибка, хоть заворачивай это AV в EAccessViolation, хоть сразу падай.
А ты считаешь что при, например Invalid Opcode ты можешь предпринять разумные действия ?
Деление на нуль просто можно не допускать. Page Fault может быть допустимым, но тогда его обрабатывает система, и в своём коде я ничего не делаю.
Короче, в С без плюсов без исключений вполне неплохо обходятся.


 
guav ©   (2008-01-26 00:37) [58]

> [55] oxffff ©   (26.01.08 00:07)

Вот кстати. Предлагается при out of bound массива вернуть fail результат.
А что если быть в этом послеовательным, и обрабатывать чтение по адресу меньше 0x10000 возвратом fail результата ?
Думаю это сильно бы увеличило время отладки программ, когда вместо AV код продолжает выполнение.


 
guav ©   (2008-01-26 00:45) [59]

> [54] Игорь Шевченко ©   (26.01.08 00:03)

Неправильный ввод обычно означает, что запрос не может быть обработан.
Если файл не открывается, обычно это означает, что делать больше нечего.
Т.е. следует прервать выполнение кода.
При этом в процитированном в [0] предлагается вместо исключений вернуть код ошибки.
Вот я и спрашиваю, если в таких ситуациях не рекомендуются исключения то когда их применять ?
Только когда ошибка в программе ?


 
oxffff ©   (2008-01-26 00:45) [60]


> ты можешь предпринять разумные действия ?


Invalid Opcode?
Floating-Point Error?

Исключение дает направление куда рыть программисту, чтобы его программа работала 24/7.

>Page Fault может быть допустимым, но тогда его обрабатывает система, и в >своём коде я ничего не делаю.

Оно не дойдет до твоего кода.


 
oxffff ©   (2008-01-26 00:48) [61]


> Только когда ошибка в программе ?


Когда ты не можеть [55]. Но программа должна работать


 
guav ©   (2008-01-26 00:58) [62]

> [60] oxffff ©   (26.01.08 00:45)

Диагностика ?
Дамп лучше делать в своём UnhandledExceptionFilter, а не в __except.


> Floating-Point Error?

Можно не допускать.
Можно отключить через Coprocessor Control Word.


> Оно не дойдет до твоего кода.

Именно.

То есть, названым исключениям в программе может быть просто не место.

И вообще это не по теме. Речь не о прерываниях процессора. а об исключениях-классах.


 
Игорь Шевченко ©   (2008-01-26 01:06) [63]

guav ©   (26.01.08 00:45) [59]


> Неправильный ввод обычно означает, что запрос не может быть
> обработан.


И что из этого следует ?


> Если файл не открывается, обычно это означает, что делать
> больше нечего.


Да. Например, тихо завершить работу, спросить, а не открыть ли другой файл, отформатировать диск, так как раз нет нужного файла - нафига такой диск сдался.
Но это все детерминированная реакция и вполне может быть представлена условным оператором.


 
Игорь Шевченко ©   (2008-01-26 01:09) [64]


> Вот я и спрашиваю, если в таких ситуациях не рекомендуются
> исключения то когда их применять ?


Очевидно в исключительных ситуациях, разве нет ? Когда программа не знает, что с этой ситуацией делать.


 
sdts   (2008-01-26 01:30) [65]


> Очевидно в исключительных ситуациях, разве нет ?

Еси смореть с позиции "С без плюсов"[57], то откуда они взялись? :)


 
oxffff ©   (2008-01-26 01:41) [66]


> guav ©   (26.01.08 00:58) [62]
> > [60] oxffff ©   (26.01.08 00:45)
>
> Диагностика ?
> Дамп лучше делать в своём UnhandledExceptionFilter, а не
> в __except.
>
>
> > Floating-Point Error?
>
> Можно не допускать.
> Можно отключить через Coprocessor Control Word.
>
>
> > Оно не дойдет до твоего кода.
>
> Именно.
>
> То есть, названым исключениям в программе может быть просто
> не место.
>
> И вообще это не по теме. Речь не о прерываниях процессора.
>  а об исключениях-классах.


Ну начинается.
UnhandledExceptionFilter?
Он что тебе точное место укажет, ах да адрес исключения.
Ну уж знаете более информативно перехватывать в негарантированно корректных местах. Это знаете как то более наглядно.

>отключить через Coprocessor Control Word.

То есть мы не ищем бажные места.
А зачем не подскажите?

> И вообще это не по теме. Речь не о прерываниях процессора.
>  а об исключениях-классах.

А вы простите что думаете классы исключения на ровном месте рождается. Не изволите заглянуть в sysutils

const
 ExceptMap: array[Ord(reDivByZero)..Ord(High(TRuntimeError))] of TExceptRec

И  GetExceptionObject(P: PExceptionRecord): Exception;


 
guav ©   (2008-01-26 02:09) [67]

> Он что тебе точное место укажет, ах да адрес исключения.

Адрес, регистры, колл стэк. Всё что надо получить можно. И по полученному дампу можно узнать гораздо больше, чем по информации из EAccessViolation.


> А вы простите что думаете классы исключения на ровном месте
> рождается.

Нет, но тема вообще о пользовательских классах исключений. т.е. вопрос кидать или не кидать, а не ловить или не ловить. И ты таки не убедил, что без исключений нельзя обойтись. В Паскале вообще исключений не было, при том что прерывания были.


 
Черный Шаман   (2008-01-26 02:19) [68]


> oxffff ©   (26.01.08 00:45) [60]
>
>
> > ты можешь предпринять разумные действия ?
>
>
> Invalid Opcode?
> Floating-Point Error?
>
> Исключение дает направление куда рыть программисту, чтобы
> его программа работала 24/7.


Правильно, но ИСКЛЮЧЕНИЕ = НЕУСТРАНИМЫЙ БАГ. Если исключение все же можно обработать и отреагировать, то исключение стоит заменить кодом возврата.


 
Kerk ©   (2008-01-26 02:25) [69]

Исключение - это когда выполнение операции невозможно. И багу в общем случае это не равно.


 
Kolan ©   (2008-01-26 08:01) [70]

> ИСКЛЮЧЕНИЕ = НЕУСТРАНИМЫЙ БАГ


Вот это баг:

function GetItem(Index: Integer): TObject;
brgin
 Result := Items[Index];
end;


А вот это эксепшен то есть исключительная, но продуманная реакция:

function GetItem(Index: Integer): TObject;
brgin
 if (Index >= 0) and (Index <= Count-1) then
   Result := Items[Index]
 else
   raise E<НужныйТип,ЧтобыШаманНеПридерался>.Create("Out of bounds.");
end;


 
Kolan ©   (2008-01-26 09:17) [71]

> Да. Например, тихо завершить работу, спросить, а не открыть
> ли другой файл, отформатировать диск, так как раз нет нужного
> файла &#151; нафига такой диск сдался.
> Но это все детерминированная реакция и вполне может быть
> представлена условным оператором.

А если я пишу компонент, или еще что-то что будет использоваться где-то, то что тогда? Тоже предлагать отформатировать Це:\?


 
Kolan ©   (2008-01-26 09:20) [72]

И что мне ненравится во всех этих обсуждениях, так это то, что оши все сводятся к тому, что ве решают что:
&laquo;Всякий овощ приносит пользу, будучи употреблен надлежащим образом в надлежащее время :)&raquo; © Игорь Шевченко

А это и так все знают&#133 В итоге эффекта от таких веток 0.

ЗЫ
 А эта закончится чем-то вроде &laquo;Эксепшены надо применять с умом&raquo;&#133


 
Loginov Dmitry ©   (2008-01-26 09:27) [73]

> А это и так все знают… В итоге эффекта от таких веток 0.


С самого начала было понятно, что ветка бестолковая.


 
Riply ©   (2008-01-26 09:40) [74]

> [72] Kolan ©   (26.01.08 09:20)
> И что мне ненравится во всех этих обсуждениях, так это то,
> что оши все сводятся к тому, что ве решают что:
> «Всякий овощ приносит пользу, будучи употреблен надлежащим
> образом в надлежащее время :)» © Игорь Шевченко
> А это и так все знают… В итоге эффекта от таких веток 0.

>  [73] Loginov Dmitry ©   (26.01.08 09:27)
> С самого начала было понятно, что ветка бестолковая.

Информацию можно получать не только от "резюме" сообщества,
но и из хода рассуждений и приведенных(используемых) аргументов.
Поэтому, IMHO, не стоит сразу записывать ветки в "ненужные" :)


 
isasa ©   (2008-01-26 11:04) [75]

ketmar ©   (25.01.08 20:57) [40]

по какому праву ты ловишь ВСЕ исключения, и никому больше их не отдаёшь?


:)

Потому, как есть придурки, которые все сообщения пересылают по почте специальному смертнику-программисту, который потом с ними(сообщениями) и разбирается, до посинения. Пользователь видит только всплывающее окно "Ошибка в программе".
Таковы корпоративные правиля.(например, у нас так)


 
Kolan ©   (2008-01-26 12:00) [76]

Удалено модератором


 
Sandman25   (2008-01-26 12:34) [77]

Мои 5 копеек.
1. Exception обязателен там, где есть необходимость прервать выполнение чего-либо (не путать с выходом из цикла). Например, если веб-сервис должен вернуть результат на основе данных из БД, а БД в дауне, то необходимо бросать Exception, а не возвращать специальный объект с особым смыслом. То есть getIndexOf(Object) вполне может вернуть -1, потому что прекращать тут нечего: задача была найти индекс, она была успешно решена. А вот getObjectWithIndex(Index) должен бросать Exception, потому что задачей было найти объект с указанным индексом, но из-за неправильного индекса пришлось выполнение задачи прекратить (например, макс. и мин. индексы хранятся в переменных, а сами данные - в БД, тогда до обращения к БД дело даже не дошло).

2. Exception обязателен там, где необходимо заставить программиста принять решение, что делать в исключительной ситуации. Но в Delphi это невозможно , а вот в java мне очень нравится, что например, если я конвертирую строку в число, я должен явно указать, что делать, если в строке не число, а не получить RuntimeException при выполнении программы.

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

4. Очень помогает вложенность Exception, то есть я могу получить от сервера один Exception, внутри которого находится другой, внутри него третий и т.д. Например, невозможно получить данные, потому что не найден объект, потому что произошла ошибка БД, потому что неверно указано наименование таблицы.

5. Exception, который содержит стек выполнения, очень полезен при разработке. То есть легче анализировать стек, чем бегать с отладчиком и смотреть, а где же был получен спец.код который указывает на ошибку.


 
isasa ©   (2008-01-26 12:41) [78]

Kolan ©   (26.01.08 12:00) [76]
Самокритика? :)


:)
Если сам себя не похвалишь, то кто еще?

Между прочим, очень удобно. Сраза видно, кто дурак. И все это проходит мимо пользователей, иногда не адекватных ...


 
isasa ©   (2008-01-26 12:47) [79]

Sandman25   (26.01.08 12:34) [77]

А может надо быть проше и люди потянутся ... :)

У тебя есть механизм. Что с ним делать, решается в данном конкретном случае, руководствуясь принятыми правилами для данного случая, местности, времени ...

Вообще - это значит никак ...


 
isasa ©   (2008-01-26 12:48) [80]

ЗЫ. Я хотел сказать, что в рамках проекта желательно иметь однообразие. Но не более. Вот и все.



Страницы: 1 2 3 вся ветка

Текущий архив: 2008.03.02;
Скачать: CL | DM;

Наверх




Память: 0.67 MB
Время: 0.017 c
11-1184741940
Volterman
2007-07-18 10:59
2008.03.02
Как правильно работать с Timer?


2-1202463532
alexsashkan
2008-02-08 12:38
2008.03.02
Проблема с загрузкой из Екселя


15-1201450136
Kerk
2008-01-27 19:08
2008.03.02
Посоветуйте файрволл


15-1201276543
Галинка
2008-01-25 18:55
2008.03.02
Портативные "читалки" текста


15-1201268375
guav
2008-01-25 16:39
2008.03.02
Exceptions considered harmful ?