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

    — Здравствуй, дружок…
    — Дяденька, вы снова расскажете мне сказку?
    — Конечно! Какой умненький мальчик!
    — А про что?
    — М… сегодня я расскажу тебе о том, куда пропадают чересчур самостоятельные мальчики вроде тебя…
    — Э! Что значит пропадают?
    — Вот то и значит… На, держи огнелиса *протянул, держа за хвост, пылающее пламенем животное* Только осторожно — он горячий!
    — Ай-ай-ай! Он брыкается!
    — Посади на него огненного жука — мигом успокоится.
    — Класс! Действует!
    — Ато! Теперь скажи ему:
    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>
    — Что вы там шепчете ему?
    — Не важно. Повтори теперь ему, что говорил ранее.
    — Нихерасебе! Вот это трейсанул так трейсанул! В чём секрет?
    — Ха! Это особая, уличная магия! Скажем так: я смог его убедить, что стектрейс очень важен для нас.
    — М… ладно, понятно, а причём тут исчезновение мальчиков?
    — А… да… пошли к дяде Хрому, мой маленький Стэк, он всё объяснит…
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 54
    • +18
      В таком стиле даже неинтересные вещи читать прикольно. осилил без напрягов.
      • –1
        однозначно) кул
        • +1
          да ну, как-то беспонтово и жеманно
      • +5
        Ну а что там с хромом?
        • –17
          С хромом ок
          Не юзаю, но одобряю
          • +4
            а хром не выводит стектрейс в консоль. только в режиме пошаговой отладки
            • +1
              • 0
                это не баг…
                • +1
                  я не против. фичреквесты там тоже принимают
                  • 0
                    я думаю они тоже не против и даже имеют это в планах ;-) или не имеют…
          • +3
            а куда пропали кавайные смайлики?
          • +6
            чувствую себя неимоверно тупым. объясните человеческим языком, что здесь произошло? :)
            • 0
              см ниже >_>
              • –1
                Я так понимаю оно вам и не надо )
              • +12
                фаербаг не показывает стектрейс, когда мы самостоятельно вызываем исключение. поэтому мы хитрожопым способом перехватываем такое исключение и показываем его самостоятельно
              • +3
                почему-то текст в голове прочитался голосом мистера Фримена :)
                • НЛО прилетело и опубликовало эту надпись здесь
                  • +2
                    вот этот мистер: mf0.me
                    • –1
                      тсс! не пали контору! ._."
                    • 0
                      да, во второй части
                      • +2
                        блин >_<" и я перепутал его с гордоном…
                      • +2
                        Мистер Фримен разговаривает вот уже 58 выпусков. Только его иногда путают с молчуном Гордоном… :)
                        • +1
                          Не Гордон Фриман (:
                          • +2
                            Обновляй комментарии!
                      • +1
                        Материал ниразу не нов.
                        Читайте eriwen.com/javascript/js-stack-trace/ кто силен в английском. Это истоки.
                        Еще автор на знает ни метод через caller, ни для оперы не указал.
                        Кроме интересной подачи тут ничего ценного нет лично для меня.
                        Все ИМХО.
                        • +1
                          там ниразу не об этом х) там кроссбраузерно печатается стектрейс, а тут исправляется баг в конкретном браузере
                          но спасибо за ссылку
                          • –4
                            Ах сорри. Привычка проглядывать топики а не читать.
                        • +1
                          Кстати, лучше не запускать код

                          (( void*(void) )0)();

                          В режиме ядра, только если вы не хотите перезагрузить компьютер :)
                          • 0
                            а как его в этом режиме запустить? *_*
                            • +1
                              С каких пор GPF вызывает перезагрузку?
                              • +1
                                Мне казалось, что я видел этот код в файле для перезагрузки ядре Linux с архитектурой i386 :). Сейчас я таких строчек там не вижу.
                                • +1
                                  ljmp $0xffff,$0x0000

                                  Или положить в стек этот адрес и retf, что одно и тоже в данном контексте.
                                  • +1
                                    Возможно ljmp 0, 0 (ваш войд) имеет смысл на платформах отличных от x86, тогда вы действительно могли видеть этот код в исходниках под другую платформу.
                                  • +1
                                    P.S. Ссылка на соответствующий файлик — google.com/codesearch/p?hl=ru#xsYd9n9zEVU/pub/linux/kernel/v2.6/linux-2.6.18.4.tar.bz2|JsQOTVwp4MI/linux-2.6.18.4/arch/i386/kernel/reboot.c&q=reboot%20lang:c%20license:gpl%20file:i386%20package:kernel.org&d=5&l=208 (почему-то пост отправился раньше времени)
                                • +1
                                  Есть здесь граммар наци? Нужна ваша поддержка.
                                  Автор отказывается ставить пробел в слове «Ато» :)
                                  • +1
                                    нихачу! нибуду! *топнул ногой и встал в гордую позу*
                                  • +1
                                    Красиво код оформлен, кстати.
                                    • НЛО прилетело и опубликовало эту надпись здесь
                                      • +1
                                        ему же потом кошмары сниться будут! х)
                                        • НЛО прилетело и опубликовало эту надпись здесь
                                          • +1
                                            лучше быть счастливым быдлом, чем сумасшедшим гением ;-)
                                            • НЛО прилетело и опубликовало эту надпись здесь
                                              • +1
                                                не согласится… и будет себя страстно ненавидить за эту свою принципиальность х)
                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                  • +1
                                                    и плачется кому ни попадя, как задолбало его быть гением %-)
                                                    • НЛО прилетело и опубликовало эту надпись здесь

                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.