Форум: "Прочее";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];
ВнизТем, кто утверждает, что тело except не должно быть пустым Найти похожие ветки
← →
test (2009-01-16 22:58) [40]oxffff © (16.01.09 22:50) [39]
Ошибка она видимо неустранимо в принципе? Логирование оно не может работать в принципе? Не стандартные ситуации не предсказуемы?
← →
oxffff © (2009-01-16 23:10) [41]
> test (16.01.09 22:58) [40]
> oxffff © (16.01.09 22:50) [39]
> Ошибка она видимо неустранимо в принципе? Логирование оно
> не может работать в принципе? Не стандартные ситуации не
> предсказуемы?
Именно так.
Ошибка не известна(либо намеренно игнорирована) и поэтому не устранима.
Если у тебя есть только контракт по логированию, реализация тебе не известна, подключается run time, но тебе нужно обеспечить нормальное продолжение после операции(возможно даже не известной).
> Ошибка она видимо неустранимо в принципе?
Да, если она не известна.
> Логирование оно не может работать в принципе?
Да, если логирование через делегат.
Не стандартные ситуации не предсказуемы?
Безусловно.
← →
Владислав © (2009-01-16 23:20) [42]
> test (16.01.09 22:39) [37]
> Владислав (16.01.09 22:21) [36]
> Вот ты счас серьезно или ради красного словца?
Я серьезно.
А ты просто так спросил, чтобы флейм разводить, или протестировать? :)
> Игорь Шевченко © (16.01.09 22:45) [38]
> Владислав (16.01.09 22:21) [36]
>
>
> > Впрочем, такой код можно писать, если после компиляции
> исходники
> > уничтожаются - и писать просто, и поддерживать не нужно.
>
> >
>
>
> Исходники надо уничтожать всегда. Иногда лучше до написания
Игорь, это была шутка, сарказм, или еще что-то? Я не понял :)
← →
Mystic © (2009-01-16 23:35) [43]
> Лично я не вижу ничего зазорного в пустом except. Или в
> таком:
Зазорно/не зазорно, но многим приходилось вылавливать ошибки других из-за try ... except end; Так что эти грабли есть. Конечно, в приведенном тобой коде трудно представить себе ошибку. Но если s это поле класса, который по непонятным причинам в этот момент уже nil, программа будет работать как ни в чем не бывало и выдавать результат 0. Это несколько сбивает с толку, потому что процесс поиска направлен в сторону нахождения момента, где в поле s записывается нецелое число. Подобные ситуации были в моей практике неоднократно.
Мне непонятно, почему нельзя добавить всего одну строку и избежать таких проблем?
try
n := strtoin(s);
except
on E: EConvertError do
n := 0;
end;
← →
oxffff © (2009-01-16 23:38) [44]
> Mystic © (16.01.09 23:35) [43]
>
> > Лично я не вижу ничего зазорного в пустом except. Или
> в
> > таком:
>
>
> но многим приходилось вылавливать ошибки
> других из-за try ... except end;
Что ошибки вылетали из такого?
try
//Do something very wrong.
...
except
//пусто
end;
← →
oxffff © (2009-01-16 23:41) [45]
> try
> n := strtoin(s);
> except
> on E: EConvertError do
> n := 0;
> end;
Такого рода решение зависит от поставновки задачи. А именно
1. Устанавливать значение по умолчанию
2. или бить тревогу.
3. Ведь может же быть что-то другое.
← →
DVM © (2009-01-16 23:42) [46]
> Mystic © (16.01.09 23:35) [43]
Конечно же к такому использованию try except надо подходить с умом. Т.е. если уж пустой оставляешь, то с гарантией, что проблем далее не возникнет. Ведь гораздо проще подавить к чертям исключение, особенно когда знаешь, что возникнуть может только оно и никакое другое, чем колупаться с on E: и т.д.
> Мне непонятно, почему нельзя добавить всего одну строку
> и избежать таких проблем?
Лень, скорее всего.
А пустой try except встречается постоянно у многих. И борланд тоже этим грешит.
← →
Mystic © (2009-01-16 23:42) [47]> Что ошибки вылетали из такого?
Из такого они не вылетали, из такого они только накапливались. И долго не находились.
← →
oxffff © (2009-01-16 23:52) [48]
> Mystic © (16.01.09 23:42) [47]
> > Что ошибки вылетали из такого?
>
> Из такого они не вылетали, из такого они только накапливались.
> И долго не находились.
Как раз именно ваш код позволяет их долго не находить.
Согласно вашего кода, любые входные параметры s корректны.
Не может быть ситуации и поэтому она просто не обрабатывается, когда входной параметр не корректен.
Более того, если пользователь например ввел 1223O333, что визуально корретна, программа проглотит без вопросов.
Однако пользователь увидит не тот результат, который должен быть для
12230333.
А управляемая ракета полетит мимо. :)
Это вопрос постановки задачи.
Ведь накапливались из-за этого самого вашего кода. :)
Ваш код говорит, что ошибок в принципе нет.
← →
oxffff © (2009-01-16 23:55) [49]
> Mystic © (16.01.09 23:42) [47]
Естественно я никак не хочу, как то дискредитировать это решение.
Я просто подвожу всех и себя к мысли, что нельзя сказать именно так хорошо и никак иначе. :)
← →
DVM © (2009-01-16 23:55) [50]
> oxffff © (16.01.09 23:52) [48]
> Согласно вашего кода, любые входные параметры s корректны.
>
это скорее обо мне :)
← →
Mystic © (2009-01-16 23:56) [51]
> А пустой try except встречается постоянно у многих. И борланд
> тоже этим грешит.
Пустой try...except имеет свой смысл. Обычно применяется там, где надо выполнить некоторую второстепенную последовательность действий абсолютно не заботясь о результате. Например, записать в лог строку. Тут мы хотим гарантировать, чтоб какой кошмар там не случился, но программа бы не завалилась.
← →
Eraser © (2009-01-16 23:59) [52]> [41] oxffff © (16.01.09 23:10)
давайте тогда каждую строку оборачивать в try..except и на заносить отчет об ошибке в лог, в случае чего. все исключения (в т.ч. обработанные) логировать полезно, но централизовано, с помощью спец. средств.
в данном случае вполне достаточноtry
Window.adjust_print_script;
except
// Не удалять блок try..except, т.к.....
end;
благо такие случаи редкость.
← →
oxffff © (2009-01-17 00:04) [53]
> Eraser © (16.01.09 23:59) [52]
> > [41] oxffff © (16.01.09 23:10)
>
> давайте тогда каждую строку оборачивать в try..except
Это уже параноидальный подход.
Достаточно защищить только опасный или неизвестный код, который может привести к другому потоку программы, и когда именно определенный поток действий программы должен соблюдаться не смотря ни на что.
← →
oxffff © (2009-01-17 00:09) [54]
> Mystic © (16.01.09 23:42) [47]
> > Что ошибки вылетали из такого?
>
> Из такого они не вылетали, из такого они только накапливались.
> И долго не находились.
Естественно, но нужно же устанавливать некий признак неудачи и проверять для продолжения дальнейших действий.
Я уверен мы все все понимаем.
А от темы мы уже ушли, как всегда. :)
Вопрос может ли быть полезен пустой код except?
Мой ответ - ДА.
А Ваш?
← →
Mystic © (2009-01-17 00:23) [55]> Вопрос может ли быть полезен пустой код except?
Может быть в редких случаях. Пример такого случая я уже обрисовал.
← →
oxffff © (2009-01-17 00:25) [56]
> Mystic © (17.01.09 00:23) [55]
> > Вопрос может ли быть полезен пустой код except?
>
> Может быть в редких случаях. Пример такого случая я уже
> обрисовал.
Уже 2 голоса ЗА!!!
:)
← →
Германн © (2009-01-17 00:36) [57]
> Может быть в редких случаях.
Я бы сформулировал несколько по иному. Есть ряд случаев, где пустой код except категорически недопустим!
← →
Игорь Шевченко © (2009-01-17 00:49) [58]Владислав © (16.01.09 23:20) [42]
> Игорь, это была шутка, сарказм, или еще что-то? Я не понял
> :)
Скорее пожелание авторам :)
← →
Германн © (2009-01-17 01:03) [59]
> Скорее пожелание авторам :)
Тем, которые ратуют за право использовать пустой код except
о)
← →
vuk © (2009-01-17 01:10) [60]Вот, помнится, Рихтер, при разборе сообщений системного журнала рекомендовал заворачивать вызов FormatMessage в блок обработки исключений а исключения игнорировать... А там вылезти может все что угодно, вплоть до Access violation.
← →
Anatoly Podgoretsky © (2009-01-17 01:12) [61]> oxffff (17.01.2009 0:25:56) [56]
Я за то, что солнце встает на западе, кто ЗА
← →
Германн © (2009-01-17 01:30) [62]
> vuk © (17.01.09 01:10) [60]
>
> Вот, помнится, Рихтер...
Не понял. Это пост ЗА или ПРОТИВ?
:)
← →
vuk © (2009-01-17 01:35) [63]to Германн © (17.01.09 01:30) [62]:
А чего непонятного-то? Ну бывают случаи, когда на исключение нужно забить. И если это действительно нужно, то я не понимаю, зачем делать догму из наличия кода в обработчике.
← →
Германн © (2009-01-17 01:43) [64]
> vuk © (17.01.09 01:35) [63]
>
> to Германн © (17.01.09 01:30) [62]:
> А чего непонятного-то? Ну бывают случаи, когда на исключение
> нужно забить.
Да я-то понял. Но Рихтер не дельфист. (Не. Кто-то из мастеров, по-моему я знаю кто, написал в шутку, что Рихтер "пишет книгу по Дельфи, но "в стол""). Но в Дельфи немного другая ситуация. Дельфи - это в первую очередь RAD-система рассчитанная на использование компонент. А вот уже при написании компонент такой подход недопустим ни в коем случае!
← →
vuk © (2009-01-17 01:46) [65]to Германн © (17.01.09 01:43) [64]:
>Да я-то понял. Но Рихтер не дельфист.
А какая разница-то, на чем писать код игнорирующий исключения?
>Дельфи - это в первую очередь RAD-система
Это средство программирования. И задачи разные бывают. Я, вот, системный журнал парсил.
← →
Германн © (2009-01-17 02:05) [66]
> vuk © (17.01.09 01:46) [65]
>
> to Германн © (17.01.09 01:43) [64]:
> >Да я-то понял. Но Рихтер не дельфист.
> А какая разница-то, на чем писать код игнорирующий исключения?
>
>
Вот я лично нарвался на серьёзную проблему при использовании стороннего компонента, в котором в одном из методов был тот самый пустой блок except. Программа моя вылетала молча. А я никак не мог понять почему!
P.S. Я уже не первый раз на этом форуме об этом конкретном случае говорю. И автор сего компонента - весьма уважаемый среди дельфистов. (По времени своего появления сравним с автором QR. По своей грамотности - гораздо выше).
А что знает Джеффри про некие компоненты?
← →
vuk © (2009-01-17 02:18) [67]to Германн © (17.01.09 02:05) [66]:
>Вот я лично нарвался на серьёзную проблему при использовании
>стороннего компонента, в котором в одном из методов был тот самый
>пустой блок except.
Ну написал кто-то кривой компонент. Так ведь из кривизны конкретного компонента вовсе не следует, что обработчик должен быть пустым или не пустым. Потому что с равной вероятностью обработчик может быть написан так, что будет приводить к неверному функционированию.
>А что знает Джеффри про некие компоненты?
А зачем оно ему? Он книжку писал про разработку под W2K. А уж на чем писать, тут разницы нет.
← →
Германн © (2009-01-17 02:23) [68]
> vuk © (17.01.09 02:18) [67]
>
> to Германн © (17.01.09 02:05) [66]:
> >Вот я лично нарвался на серьёзную проблему при использовании
> >стороннего компонента, в котором в одном из методов был
> тот самый
> >пустой блок except.
>
> Ну написал кто-то кривой компонент. Так ведь из кривизны
> конкретного компонента вовсе не следует, что обработчик
> должен быть пустым или не пустым. Потому что с равной вероятностью
> обработчик может быть написан так, что будет приводить к
> неверному функционированию.
← →
Германн © (2009-01-17 02:29) [69]Случайно нажал "Добавить".
В методе того компонента был тот самый пустой блок except. Но в том методе вызывался пользовательский обработчик. Так вот ошибка была именно в нём. Я ожидал, что, если будет ошибка, то будет и сообщение об ощибке! Ан нет.
← →
Игорь Шевченко © (2009-01-17 03:06) [70]vuk © (17.01.09 02:18) [67]
> >А что знает Джеффри про некие компоненты?
> А зачем оно ему? Он книжку писал про разработку под W2K.
> А уж на чем писать, тут разницы нет.
В стол :)
А если по теме, то можно использовать и пустой блок except end и goto, Аллах простит. И компилятор откомпилирует без хинтов и предупреждений.
Хотя лично я за то, что если в программе ошибка, то пусть она вылетает с максимально громким треском - ее найти при этом проще.
← →
Германн © (2009-01-17 04:05) [71]
> Игорь Шевченко © (17.01.09 03:06) [70]
>
> vuk © (17.01.09 02:18) [67]
>
>
> > >А что знает Джеффри про некие компоненты?
> > А зачем оно ему? Он книжку писал про разработку под W2K.
>
> > А уж на чем писать, тут разницы нет.
>
>
> В стол :)
В стол.
Не. Ну это не ты первый упомянул сей термин, зафиксированный в Орешнике! Или ты?
В общем-то без разницы, лишь ради исторической справедливости.
← →
test (2009-01-17 08:40) [72]Игорь Шевченко © (17.01.09 03:06) [70]
Не обязательно вылетать, часть ошибок можно обработать.
oxffff © (17.01.09 00:09) [54]
Тебе дадут на сопровождение прогу которая писалась 5 лет назад с пустыми исключениями, может тогда поймеш в чем зло этого подхода.
← →
Sergey Masloff (2009-01-17 10:52) [73]test (17.01.09 08:40) [72]
+1
Кстати хотелось бы увидеть пример и описание условий в которых может произойти ЛЮБОЕ исключение и нельзя написать on E:Tконкретный класс исключений ;
← →
{RASkov} © (2009-01-17 11:18) [74]Вот раздули.... :) Какая разница пустой блок или не пустой, нужно писать грамотно и с трезвой головой с учетом на будущее, а там не важно как ты пишешь.... или хотите сказать так не бывает? Бывает.
← →
oxffff © (2009-01-17 11:46) [75]
> test (17.01.09 08:40) [72]
Не нужно перегибать палку.
Я привел пример, когда это востребовано и оправдано.
А ты пытаешься перефразировать мои слова на свой лад.
>Sergey Masloff (17.01.09 10:52) [73]
Есть мой многопоточный планировщик запуска некоторых заданий в зависимости от изменений в файловой системе. Если мне не изменяет память построен на IOComplentionPort. Причем само задание и логирование его исполнения - это ислючительно контракт.
Итак упрощенно есть ITask, ILog.
Cхема у меня в реальном проекте на несколько уровней try больше.
Упрощено так.
try
ILog.Infrom("Task Start");
try
ITask.Start;
except
ILog.Infrom("Task Error");
raise;
end;
ILog.Infrom("Task End");
except
//Попадаем сюда в случае сбоя ILog или при сбоя ITask.
end;
← →
Sergey Masloff (2009-01-17 11:53) [76]oxffff © (17.01.09 11:46) [75]
То есть никто у тебя не стартовал, лог тоже сбойнул никто про это не узнал все хорошо. Спасибо, следующий ;-)))
← →
oxffff © (2009-01-17 11:59) [77]
> Sergey Masloff (17.01.09 11:53) [76]
> oxffff © (17.01.09 11:46) [75]
> То есть никто у тебя не стартовал, лог тоже сбойнул никто
> про это не узнал все хорошо. Спасибо, следующий ;-)))
Ты что глупый?
Во первых
>Cхема у меня в реальном проекте на несколько уровней try больше.
В главных
Лог это возможность информировать пользователя.
Если он сбойнул, то этой возможности нет.
← →
oxffff © (2009-01-17 12:03) [78]
> Sergey Masloff (17.01.09 11:53) [76]
Ты слышал про Double Fault?
← →
oxffff © (2009-01-17 12:05) [79]
> Sergey Masloff (17.01.09 11:53) [76]
На самом деле у меня ILog.Infrom("Task Start") тоже оборачиваются.
Но я специально упростил, чтобы было понятней.
← →
Sergey Masloff (2009-01-17 12:05) [80]oxffff © (17.01.09 11:59) [77]
Я все понял. Программа не работает но внешне все хорошо. Повторяю спасибо, мне слышать больше ни о чем не надо.
Страницы: 1 2 3 4 5 6 вся ветка
Форум: "Прочее";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];
Память: 0.64 MB
Время: 0.06 c