Обработка исключений.
Nov. 20th, 2006 11:14 amНет ничего полезнее массово встроенных в программу средств диагностики.
В обработчик исключений в программе встроена запись информации о исключении в базу данных (если исключение не касается пропадания соединения с базой, конечно).
Благодаря этому исправил уже штук 5 глюков, в основном связанных с тонкими эффектами, зависящими от последовательности действий пользователей, которые без упорного распланированного многодневного тестирования после разработки фиг найдешь.
Дельфи, конечно, туповат в плане информации об исключениях - без сторонних компонентов, работающих неизвестно как, информации о месте, где произошло исключение, не получишь. А компоненты эти заставляют извращать параметры компиляции, и если в них ошибится - запросто способны начать выдавать такие исключения, что исходные покажутся мелочью. Раскрутка фреймов стека при их отсутствии, например. Или разное поведение при компиляции с пакетами или без.
Но для поиска достаточно адреса, по которому произошла ошибка - заглянуть по нему дизассемблером и почти всегда сразу видно, в чем проблема.
А еще одна вещь, по поводу которой я всегда спорю с
belnetmon - это использование собственных исключений. Во всех своих функциях, на вход которых подаются параметры извне, я все параметры проверяю на валидность - индексы на попадание в диапазон, ссылки на объекты на неравенство nil, при поиске в ассоциативных массивах - наличие ключа в массиве и выкидываю собственное исключение если чего-то не так. В исключение помещается имя класса и метода, где оно произошло, имя и значение параметра вызвавшего ошибку, итд.
Когда в программе 65000 строк кода, написанного за два года, чего-нибудь не сломать при доработке можно, только пользуясь такими методами.
Вот еще бы все тоже самое сделать на сервере баз данных. Но при всем удобстве тамошних языков, они убогие и там хотя бы нужную функциональность написать и заставить работать. Посему весь серверный код надо выкинуть, то бишь перенести на сервер приложений. Заодно от зависимости от вида сервера избавиться можно будет.
В обработчик исключений в программе встроена запись информации о исключении в базу данных (если исключение не касается пропадания соединения с базой, конечно).
Благодаря этому исправил уже штук 5 глюков, в основном связанных с тонкими эффектами, зависящими от последовательности действий пользователей, которые без упорного распланированного многодневного тестирования после разработки фиг найдешь.
Дельфи, конечно, туповат в плане информации об исключениях - без сторонних компонентов, работающих неизвестно как, информации о месте, где произошло исключение, не получишь. А компоненты эти заставляют извращать параметры компиляции, и если в них ошибится - запросто способны начать выдавать такие исключения, что исходные покажутся мелочью. Раскрутка фреймов стека при их отсутствии, например. Или разное поведение при компиляции с пакетами или без.
Но для поиска достаточно адреса, по которому произошла ошибка - заглянуть по нему дизассемблером и почти всегда сразу видно, в чем проблема.
А еще одна вещь, по поводу которой я всегда спорю с
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Когда в программе 65000 строк кода, написанного за два года, чего-нибудь не сломать при доработке можно, только пользуясь такими методами.
Вот еще бы все тоже самое сделать на сервере баз данных. Но при всем удобстве тамошних языков, они убогие и там хотя бы нужную функциональность написать и заставить работать. Посему весь серверный код надо выкинуть, то бишь перенести на сервер приложений. Заодно от зависимости от вида сервера избавиться можно будет.