Кромешный ад
Feb. 16th, 2011 10:23 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Забыл добавить using для IEnumerator в функции intersperse для IEnumerable.
Убил два часа разбираясь, почему после одного исключения при ленивой загрузке графа объектов из базы в F# дальше начинают сыпаться другие исключения, насчет незакрытого DataReader. Оказалось - расставлял функцией intersperse запятые между именами полей, для отладочной печати списка, имена полей были ленивые и на одном из вызовов сыпалось первое исключение, а sprintf "%A", оказывается, не кидает наверх исключения в ToString(), поэтому прога не валилась, а дальше начинали сыпаться исключения из-за неубитого IEnumerator, внутри которого жил DataReader.
И все это блин в сплошной ленивости и 30-уровневых стеках вызова, из которых две трети - сплошные нечитабельные автосгенерированные компилятором F# замыкания.
В общем, в обычных приложениях отладчик не нужен, а в таких он еще и бесполезен - скачет по программе произвольным образом по причине ленивости. И стеки вызова при исключениях тоже бесполезны, потому что вся программа представляет собой адский граф фильтров для потоков данных из БД в конечный результат.
Убил два часа разбираясь, почему после одного исключения при ленивой загрузке графа объектов из базы в F# дальше начинают сыпаться другие исключения, насчет незакрытого DataReader. Оказалось - расставлял функцией intersperse запятые между именами полей, для отладочной печати списка, имена полей были ленивые и на одном из вызовов сыпалось первое исключение, а sprintf "%A", оказывается, не кидает наверх исключения в ToString(), поэтому прога не валилась, а дальше начинали сыпаться исключения из-за неубитого IEnumerator, внутри которого жил DataReader.
И все это блин в сплошной ленивости и 30-уровневых стеках вызова, из которых две трети - сплошные нечитабельные автосгенерированные компилятором F# замыкания.
В общем, в обычных приложениях отладчик не нужен, а в таких он еще и бесполезен - скачет по программе произвольным образом по причине ленивости. И стеки вызова при исключениях тоже бесполезны, потому что вся программа представляет собой адский граф фильтров для потоков данных из БД в конечный результат.
no subject
Date: 2011-02-16 09:27 pm (UTC)no subject
Date: 2011-02-16 11:11 pm (UTC)no subject
Date: 2011-02-17 09:09 am (UTC)no subject
Date: 2011-02-17 04:23 pm (UTC)А чому?
no subject
Date: 2011-02-17 04:40 pm (UTC)log4net точно так же работает.
no subject
Date: 2011-02-18 09:13 am (UTC)no subject
Date: 2011-02-18 09:15 am (UTC)no subject
Date: 2011-02-18 11:25 am (UTC)no subject
Date: 2011-02-18 12:00 pm (UTC)У меня же C#/F#, где исключения являются общепринятым и стандартным способом обработки ошибок.
no subject
Date: 2011-02-18 01:02 pm (UTC)no subject
Date: 2011-02-18 02:05 pm (UTC)Дебаггер неудобоварим по другой причине - массовое использование функций высшего порядка, ленивость и реализация компилятора F#, т.е. стек вызовов просто скачет по всем исходникам туда-сюда, перемежаясь автоматически сгенерированными компилятором методами.
no subject
Date: 2011-02-18 02:40 pm (UTC)