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



Когда меня попросили дописать одну штуку в код, я сказал - "Да как нехрен делать!". Потому что дописать в итоге надо было всего одну строчку. Разумеется, я тут же увидел, как именно здесь может рухнуть программа, и, весьма гордый собой, дописал ещё две строчки, во всех ракурсах предупреждающие возможную проблему.



Тут же замутив тестовый запуск, я с нескрываемым удовольствием пошёл проверять, как сработает то самое место, что я защитил двухслойной бронёй. Если вы думаете, что выражение лица Копперфильда, собирающегося спиздить Статую Свободы прямо перед многотысячной толпой, хоть на 10 процентов дотягивало до тех эмоций, что играли в этот момент на еблище моего лица - вы жестоко ошибаетесь. Жестом ахуенного фокусника я нажал кнопку...



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



И тут я понял, что достиг вершин просветления.



Законы Клипштейна в приложении к созданию опытных образцов и производству.

<...>

5. Прибор, защищаемый быстодействующим плавким предохранителем, сумеет защитить этот предохранитель, перегорев первым.





Комментарии
06.08.2004 в 10:43

И что это были за строчки?
06.08.2004 в 10:56

Есть некий объект, отнаследованый от Grid. Ситуация - при удалении записи нужно, чтобы курсор выделял первую строку. Реализуется это так:



this.ActiveRow=this.Rows[0];



Падение возможно, если



1)в grid не были загружены строки

2)были загружены, но после удаления их число стало равно нулю.



if(this.Rows!=null) //исключаем, если строки не были заданы

if(this.Rows.[0]!=null) //исключаем, если удалили последнюю строку и она стала undefined

this.ActiveRow=this.Rows[0];





Вот во второй строчке и крылась ошибка. На null компилятор проверить её не успевал именно потому, что она была сама undefined :)Правильный вариант выглядел так:



if(this.Rows!=null)

if(this.Rows.Count>0)

this.ActiveRow=this.Rows[0];
06.08.2004 в 11:15



Падение возможно, если



1)в grid не были загружены строки





каким образом тогда одну из них можно удалить?
06.08.2004 в 11:19

Enkryptor Ты абсолютно прав. Но её не "можно было удалить". Можно было нажать кнопку удаления, находясь фокусом на пустой таблице. Но сегодня человек, который отвечет за toolbar, допишет enable/disable на все кнопки и эта строка станет ненужной.
06.08.2004 в 11:35

т.е. ты писал реакцию не на удаление строчки, а на нажатие кнопки удаления?
06.08.2004 в 12:05

Хихс. А что значит "реакция на удаление строчки"? Есть событие RowSelected, есть событие ColumnResize, но вот события RowDeleted нету, если мне не изменяет :) Там был просто обработчик нажатой кнопки. А кнопка в некоторых случаях не должна была быть активной. По науке. Вот, сегодня всё будет в шоколаде :)
09.08.2004 в 09:42

Насколько культура программирования видится мне, функция выделения первой строчки должна вызываться из процедуры удаления строчки. Которая, в свою очередь, даже будучи вызвана с пустой таблицей, должна увидеть ошибку и нормально завершить работу. У вас же получается, что пустая таблица делает неактивной кнопку, просто не позволяя пользователю воспользоваться функцией удаления. Однако впоследствие возможны изменения кода - и функция удаления строчки может оказаться задействована из других функций, в обход пользовательского интерфейса.
09.08.2004 в 11:14

>>функция выделения первой строчки должна вызываться из процедуры удаления строчки



Именно так. Разве я где-то упомянул обратное?



>>Которая, в свою очередь, даже будучи вызвана с пустой таблицей, должна увидеть ошибку и нормально завершить работу.



Именно так. Разве не для этого и писались две предупреждающие строчки?



>>У вас же получается, что пустая таблица делает неактивной кнопку,



И это тоже! При любом перемещении по таблице всё меню динамически перестраивается, постоянно. В зависимости от выделенной строки и её характеристик. Точно так же оно и перестраивается в случае, когда удаляется последняя запись.
09.08.2004 в 11:30

>>Которая, в свою очередь, даже будучи вызвана с пустой таблицей, должна увидеть ошибку и нормально завершить работу.



> Именно так. Разве не для этого и писались две предупреждающие строчки?





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

Тьфу ты, ёперный театр. Нет никакой функции выделения первой строчки. Нетуууууу. Это одна-единственная строчка, входящая в состав функции удаления DeleteItem(). this.ActiveRow=this.Rows[0];. Вот вся "функция выделения первой строки". Не буду же я её выносить в отдельный private void SelectFirstRow(...), правильно? Ну зачем одну строчку выносить. И всё. Нажимается кнопка на форме. Или нажимается горячая клавиша Del. Вызывается функция удаления DeleteItem(). Удаляет выделенную строчку (3 строки кода). Потом выделяет первую запись, как я написал выше. Всё.

09.08.2004 в 11:49

Тогда непонятно, почему ты не дописал проверку таблицы на наличие содержимого раньше.
09.08.2004 в 11:57

Ыыыыыы.



Во писец. Полез в исходники, чтобы надёргать куски кода и показать что откуда вызывается. Оба компонента срубили к чёртовой матери. Проекты из солюшена и даже из СоурСейфа. Япона мать, когда успели. В пятницу ж ещё были. Интересная перестройка.
09.08.2004 в 12:02

Занятный финал.
17.08.2004 в 10:24

Вообще-то мой ник пишется так: TaHkucT.
Tzota, ну что ж, по крайней мере, три строчки исходников у тебя остались)



А еще бывает обидно, когда сервер падает на отладочной печати.)
17.08.2004 в 10:29

tahkuct Дык мне не страшно. Если снесли - значит опять смена философии и перестановки в правительстве :-) Мы привыкшие :) Сегодня асфальт кладём (правительство едет), завтра снимаем (танки перегоняют).



Гыгы. Да, эт хорошо :)

Расширенная форма

Редактировать

Подписаться на новые комментарии