Каскадная генерация ошибок в JavaScript

Jan 28, 2008 21:43


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

Но вот организация поведения скрипта при обнаружении ошибки вызвала затруднения. Ошибки перехватываются в блоках try{...}, далее в каждой функции следует коротенький блок catch{...}, куда при этом передаётся управление. Вопрос: как обеспечить знание вызывавшей функции о том, что в вызванной функции сработало прерывание, дабы вернуться по цепочке к исходной функции, запущенной событием (вроде onload или onclick)? Сначала я попытался возвращать из блока catch{...} значение null, а результат каждой функции проверять на равенство ему. Но этот подход, не вызывавший особых проблем в PHP, начал так уродовать код, что я остановился и задумался.

Дальше была попытка запускать каждую функцию примерно таким образом: eval(run(функция(аргументы))). Замысел был такой, что функция run должна преобразовывать возврат функции в такой текст. Причём такой текст, что нормальный возврат на выходе eval давал бы сам себя, а null вызывал бы прерывание (для этого сгодился бы такой текст - throw""). Однако, не удалось добиться корректной работы для всех типов возвратов.

Решение оказалось простым до изумления. Блок catch{...} должен выглядеть примерно так:

catch(e){
return _LogError(e);
}

где функция _LogError возвращает (выполнив нужную операцию, скажем, запись в консоль) не что-нибудь, а объект new Error()!

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

Пусть сумбурно, но я должен был это рассказать!

javascript, программирование

Previous post Next post
Up