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

Вниз

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

 
guav ©   (2008-01-25 16:39) [0]

Странное мнение об исключениях высказано в MSDN:

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 handlers should not be used to redirect the program"s normal flow of control. For example, an exception should not be thrown in cases of potential logic or user input errors, such as the overflow of an array boundary. In these cases, simply returning an error code may be simpler and more concise. Judicious use of exception handling constructs makes your program easier to maintain and your code more readable.

http://msdn2.microsoft.com/en-us/library/c0hwkhwe.aspx

У меня противоположное мнение. Исключения - наиболее удачная защита от выходов за диапазоны массива и неверного ввода.
Интересно мнение других. Считаете ли вы эту рекомендацию неправильной или правильной (для большинства случаев) ?


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

Правильно пишут. Exception - оно как goto. Ход выполнения программы становится неясным.

А что касается Delphi, так и вовсе неудобно, когда программная логика кодируется через Exceptions. Мало того, что среда останавливается на них, так еще и не поймешь программу сразу.


 
clickmaker ©   (2008-01-25 16:48) [2]

в отдельных случаях -- очень напрягает.
Например, есть в .NET у объекта DataTableReader метод GetOrdinal.
Возвращает индекс колонки по имени.
Что он должен возвращать, если не нашел поле?
Вот и подумал сперва, что -1
Так ведь нет! Он кидает ArgumentException
нахрена...


 
DiamondShark ©   (2008-01-25 16:49) [3]

Действительно странно приводить overflow of an array boundary как пример potential logic.


 
DiamondShark ©   (2008-01-25 16:53) [4]


> Так ведь нет! Он кидает ArgumentException
> нахрена...

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

Встречный вопрос: нахрена пытаться интерпретировать как имя колонки непойми какую левую строку?


 
DiamondShark ©   (2008-01-25 16:57) [5]


> Exception - оно как goto. Ход выполнения программы становится
> неясным.

С гото и рядом не лежало.


 
clickmaker ©   (2008-01-25 17:01) [6]


> [4] DiamondShark ©   (25.01.08 16:53)

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


 
DiamondShark ©   (2008-01-25 17:20) [7]


> раз Get, значит, мы что-то от него должны получить по-любому

Давай продолжим твою логику.
Раз GetOrdinal, значит получить мы должны именно индекс колонки. Иначе чего это написано GetOrdinal, а не GetAnyStinkyInteger?
А раз именно индекс, то мы смело можем использовать его, скажем, в Items[].
Ну и далее, конечно. Items[GetOrdinal("@#$%@#$")] должен пуп порвать, но вернуть итем, который, конечно же, должен преспокойно отнестись к Items[GetOrdinal("@#$%@#$")].Value = 123

Скажешь: "Не доходи до маразма"?
Полностью согласен. Маразм начинается в тот момент, когда смешивают две разные сущности: "Индекс итема" и "Код завершения метода".


 
Семеныч   (2008-01-25 17:31) [8]

Объявляю класс EUserInputException и при неправильном вводе спокойно его возбуждаю. Все вполне прозрачно и удобно.


 
clickmaker ©   (2008-01-25 17:41) [9]


> [7] DiamondShark ©   (25.01.08 17:20)

ок. А почему тогда DataColumnCollection.IndexOf возвращает -1 при неудаче?
ведь по логике - методы равнозначны


 
DiamondShark ©   (2008-01-25 18:15) [10]


> clickmaker ©   (25.01.08 17:41) [9]
>
> ок. А почему тогда DataColumnCollection.IndexOf возвращает
> -1 при неудаче?

Потому что есть соглашения об абстрактной коллекции, где сказано возвращать -1, если объекта нет. Почему в абстракной коллекции сделано так, я не знаю. Честно. Тем более, что есть bool Contains().
Могу только предположить, что по соображениям эффективности. Конструкция вида:
if (collection.Contains(item))
{
 i = collection.IndexOf(item);
 ...
}
приведёт к двойному просмотру коллекции.
А может, всё теже соображения о potential logic. Всё-таки, для абстрактной коллекции поиск неизвестно каких объектов более вероятный сценарий, чем поиск колонок по отбалды сформированным именам.


 
Галинка ©   (2008-01-25 18:36) [11]

Читала статью Реймонда Чена на этй тему. Интересно.


 
ketmar ©   (2008-01-25 18:53) [12]

чуть-чуть оффтоп:
я так радовался, что в Component Pascal нет исключений… а писать иногда приходится на OO2C, где исключения есть. и если бы они просто были… нет, их стандартная библиотека, зараза, использует.


 
Kolan ©   (2008-01-25 19:29) [13]

> Правильно пишут.


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


 
ketmar ©   (2008-01-25 19:43) [14]

>[13] Kolan©(25.01.08 19:29)
а что тут говорить? меняем шило на мыло. всё применимо, если с умом. хотя я бы не стал так менять. лучше пусть все низкоуровневики возвращают код ошибки, а над ними навёрнут предметный слой, который уже может кидаться исключениями.


 
Черный Шаман   (2008-01-25 19:49) [15]


> guav ©   (25.01.08 16:39)
>
> Странное мнение об исключениях высказано в MSDN:
>
> 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 handlers should not be used to redirect the program"s
> normal flow of control. For example, an exception should
> not be thrown in cases of potential logic or user input
> errors, such as the overflow of an array boundary. In these
> cases, simply returning an error code may be simpler and
> more concise. Judicious use of exception handling constructs
> makes your program easier to maintain and your code more
> readable.
>
> http://msdn2.microsoft.com/en-us/library/c0hwkhwe.aspx
>
> У меня противоположное мнение. Исключения - наиболее удачная
> защита от выходов за диапазоны массива и неверного ввода.
>
> Интересно мнение других. Считаете ли вы эту рекомендацию
> неправильной или правильной (для большинства случаев) ?


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


 
Kolan ©   (2008-01-25 19:51) [16]

Есть еще такой подход, когда слои должны заменять эксепшены ниже стоящих слоев на свои&#133
Имхо, Exceptions can not be considered to be harmful&#133


 
Kolan ©   (2008-01-25 19:53) [17]

Кроме того Exception — это объект, что гораздо универсальнее кода ошибки. В него и строку можно поместить и код и что угодно&#133


 
Черный Шаман   (2008-01-25 19:55) [18]


>
> guav ©   (25.01.08 16:39)


Хлтя если бы сделали несколько уровней исключений(256 уровней хватит), то можно было бы указывать отладки исключения какого уровня ловить. А пока только можно или полностью отключить перехват исключений отладчиком или включить.


 
Kolan ©   (2008-01-25 19:58) [19]

>
> Хлтя если бы сделали несколько уровней исключений(256 уровней
> хватит),

Непонял, а наследование не спасет отца русской демократии?


 
Черный Шаман   (2008-01-25 20:02) [20]


> Kolan ©   (25.01.08 19:58) [19]
>
> >
> > Хлтя если бы сделали несколько уровней исключений(256
> уровней
> > хватит),
>
> Непонял, а наследование не спасет отца русской демократии?


И как в Delphi можно задать остановку программы при отладке только по затребованным типам исключений(и их наследников)? Пока можно только задавать игнорируемые исключения. Тоесть явное неудобство.

Или баг сети(нет доступа к серверу в Indy) это баг программы?


 
DiamondShark ©   (2008-01-25 20:03) [21]


> А пока только можно или полностью отключить перехват исключений
> отладчиком или включить.

Они, вообще-то, по классам отключаются. Что гораздо удобнее, чем уровни: можно целыми ветками иерархии оперировать. Хочешь -- отфильтровал исключения ввода-вывода, хочешь -- исключения БД.


 
DiamondShark ©   (2008-01-25 20:06) [22]

А вообще, чего только не considered harmful.
И наследование объявляли, и ООП вообще, и гото, и циклы...


 
Kolan ©   (2008-01-25 20:14) [23]

> Или баг сети(нет доступа к серверу в Indy) это баг программы?

Что за сравнение баг = эксепшен?


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

>[23] Kolan©(25.01.08 20:14)
>Что за сравнение баг = эксепшен?

а разве не так? что коды ошибок не обрабатывают, что исключения. фиг ли разницы.


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


> Kolan ©   (25.01.08 20:14) [23]
>
> > Или баг сети(нет доступа к серверу в Indy) это баг программы?
>
> Что за сравнение баг = эксепшен?


Екзепшен должен кидаться только при наличии бага.


 
DiamondShark ©   (2008-01-25 20:22) [26]


> Что за сравнение баг = эксепшен?

Так до сих пор полно людей, которые уверены, что исключения -- это такой удобный способ для подавления Access Violation.
Серьёзно.
Я даже в какой-то книжке по дельфи то-ли 2, то-ли 3 видел рассуждения, что механизм исключений -- замечательная находка разработчиков дельфи, позволяющая существенно повысить живучесть программы, дескать, раньше, случись чего, программа просто падала выдав страшное ругательство, а теперь такие неожиданности можно просто тихо удушить подушкой.


 
Черный Шаман   (2008-01-25 20:26) [27]


> Kolan ©   (25.01.08 20:14) [23]
>
> > Или баг сети(нет доступа к серверу в Indy) это баг программы?
>
>
> Что за сравнение баг = эксепшен?


И с другой стороны написать
if функция()
begin
...
end
else
logger.log(....)

или
try
функция()
...
except on E:Exception do
logger.log(...)
end;

Когда мне фиолетово что там произошло, но главное что в данном месте ошибка. Хотя второй случай удобнее, но зачем же отладчике останавливаться. Особенно если оно станет в обработчике нити, то часто Delphi приходится снимать по ресету, так как к TM оно не пустит.


 
Kolan ©   (2008-01-25 20:26) [28]

> Екзепшен должен кидаться только при наличии бага.

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


 
ketmar ©   (2008-01-25 20:26) [29]

>[27] Черный Шаман (25.01.08 20:26)
за «второй случай» надо медленно сажать на кол.


 
ketmar ©   (2008-01-25 20:27) [30]

>[28] Kolan©(25.01.08 20:26)
>Послание эксепшена это нормальная реакция программы.

охренеть. сегодня не просто утро, сегодня целый день «вокруг смеха» идёт.


 
Черный Шаман   (2008-01-25 20:29) [31]


> ketmar ©   (25.01.08 20:26) [29]
>
> >[27] Черный Шаман (25.01.08 20:26)
> за «второй случай» надо медленно сажать на кол.


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


 
Kolan ©   (2008-01-25 20:32) [32]

> [27] Черный Шаман   (25.01.08 20:26)

Мда&#133

А если у тебя миллион функций? Будешь миллион раз писать else logger.log(&#133)?

А при работе с исключениями, можно воспользоваться OnException TApplication.


> Хотя второй случай удобнее, но зачем же отладчике останавливаться.

Ну не останавливайся.


> Особенно если оно станет в обработчике нити

Это да, тут глюк Delphi побороть можно(нормально) только логом.


> но главное что в данном месте ошибка

Главное пойми что эксепшены это не ошибки, наоборот это значит что все идет по плану. Эксепшены надо обрабатывать(в большинстве случиев), а не тупо логировать&#133


 
Черный Шаман   (2008-01-25 20:32) [33]


> ketmar ©   (25.01.08 20:26) [29]
>
> >[27] Черный Шаман (25.01.08 20:26)
> за «второй случай» надо медленно сажать на кол.


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


 
Kolan ©   (2008-01-25 20:34) [34]

> охренеть. сегодня не просто утро, сегодня целый день «вокруг
> смеха» идёт.

Ты мне хочешь сказать, что написав
raise Exception.Create("Превед ketmar я не ошибко");
Я сделал в программе ошибку(баг)?

Действительно смешно&#133


 
Черный Шаман   (2008-01-25 20:36) [35]


> Kolan ©   (25.01.08 20:32) [32]
>
> > [27] Черный Шаман   (25.01.08 20:26)
>
> Мда…
>
> А если у тебя миллион функций? Будешь миллион раз писать
> else logger.log(…)?


Знаешь, мне не лень, это просто code стандарт принятый у нас, который избавляет от многих бессонных ночей потом в отслеживании ошибки у конкретного пользователя. Кстати, у нас в программе есть даже 3 случая использования goto.


 
Kolan ©   (2008-01-25 20:38) [36]

> это просто code стандарт принятый у нас

Только эксепшены в этом не виноваты.


> Кстати, у нас в программе есть даже 3 случая использования
> goto.

Зачет :)


 
Черный Шаман   (2008-01-25 20:38) [37]


> Ты мне хочешь сказать, что написав
> raise Exception.Create("Превед ketmar я не ошибко");


За такое нужно трахать в жопу всем отделом. Если уже кидаешь, то хоть свой наследник класс порождай.


 
Kolan ©   (2008-01-25 20:47) [38]

>
> За такое нужно трахать в жопу всем отделом.

Не понял меня, да?


 
Черный Шаман   (2008-01-25 20:52) [39]


> Kolan ©   (25.01.08 20:47) [38]
>
> >
> > За такое нужно трахать в жопу всем отделом.
>
> Не понял меня, да?


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

Екзепшены это порочная практика, применимая в нескольких случаях, так же как и goto.


 
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 применён разумно. я в Си, например, частенько готой пользуюсь, и ничего. никаких проблем.



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

Форум: "Прочее";
Текущий архив: 2008.03.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.044 c
3-1192477342
ari_9
2007-10-15 23:42
2008.03.02
как правильно выполн."по таймеру" действия в бд (клиент-сервер) ?


2-1201985154
Бэтман
2008-02-02 23:45
2008.03.02
edit


15-1196204041
KilkennyCat
2007-11-28 01:54
2008.03.02
А "Орешник" все-таки жалко.


2-1202216737
alexsashkan
2008-02-05 16:05
2008.03.02
Добавление Столбца в запросе.


2-1202211175
_Shuler_
2008-02-05 14:32
2008.03.02
Clipboard





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