Как стать автором
Обновить

Притча о пропавшем Стэке

Время на прочтение 3 мин
Количество просмотров 950
— Здравствуй, дружок…
— Дяденька, вы снова расскажете мне сказку?
— Конечно! Какой умненький мальчик!
— А про что?
— М… сегодня я расскажу тебе о том, куда пропадают чересчур самостоятельные мальчики вроде тебя…
— Э! Что значит пропадают?
— Вот то и значит… На, держи огнелиса *протянул, держа за хвост, пылающее пламенем животное* Только осторожно — он горячий!
— Ай-ай-ай! Он брыкается!
— Посади на него огненного жука — мигом успокоится.
— Класс! Действует!
— Ато! Теперь скажи ему:
function throwException( ){
    (void 0)()
}
throwException()

— Он ругается!
— Именно, когда он слышит что-то непонятное, то начинает поливать тебя стектрейсами. А теперь скажи:
function throwError( ){<br>    throw new Error( 'error' )<br>}<br>throwError()<br>
— Что-то буркнул и всё.
— Угу, тут ему видите ли лень трейсануть в тебя стек.
— Как же тогда быть? Иногда же бывает нужно сказать что-нибудь эдакое…
— Дай-ка его сюда… *шепчу ему на ушко мантру*
var Error= new function( Original ){<br><br>Version: 1<br>Description: "repairs mozilla's stacktrace in custom errors"<br>License: 'public domain'<br><br>Implementation:<br><br>var Error= ( window.console && Original && ( new Original ).stack )<br>?  function( message ){<br>        var e= new Original( message )<br>        var custom= function( msg, file, line ){<br>            restore()<br>            if( other && other.apply( this, arguments ) ) return true<br>            if(( e.message != msg )||( e.fileName != file )||( e.lineNumber != line )) return<br>            var stack= e.stack.split( '\n' )<br>            stack= stack.slice( 2, stack.length - 1 )<br>            stack[0].replace( /^.*\(.+?\)@(.+):(\d+)$/, function( str, file, line ){<br>                e.fileName= file<br>                e.lineNumber= Number( line )<br>            })<br>            stack[ stack.length - 1 ]= stack[ stack.length - 1 ].replace( /^@.+:\d+$/, function( str ){<br>                return 'source file()' + str<br>            })<br>            e.stack= stack.join( '\n' )<br>            console.error( e )<br>            return true<br>        }<br>        var other= window.onerror<br>        var restore= function(){<br>            if( window.onerror === custom ) window.onerror= other<br>        }<br>        window.onerror= custom<br>        setTimeout( restore, 1 )<br>        return e<br>    }<br>:  Original<br><br>Export: return Error<br><br>Usage: throw new Error( 'custom error' )<br><br>}( window.Error )<br>
— Что вы там шепчете ему?
— Не важно. Повтори теперь ему, что говорил ранее.
— Нихерасебе! Вот это трейсанул так трейсанул! В чём секрет?
— Ха! Это особая, уличная магия! Скажем так: я смог его убедить, что стектрейс очень важен для нас.
— М… ладно, понятно, а причём тут исчезновение мальчиков?
— А… да… пошли к дяде Хрому, мой маленький Стэк, он всё объяснит…
Теги:
Хабы:
+71
Комментарии 54
Комментарии Комментарии 54

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн