11 марта 2010 в 03:19

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

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

Комментарии (54)

  • +18
    В таком стиле даже неинтересные вещи читать прикольно. осилил без напрягов.
    • –1
      однозначно) кул
      • +1
        да ну, как-то беспонтово и жеманно
  • +5
    Ну а что там с хромом?
    • –17
      С хромом ок
      Не юзаю, но одобряю
    • +4
      а хром не выводит стектрейс в консоль. только в режиме пошаговой отладки
      • +1
        • 0
          это не баг…
          • +1
            я не против. фичреквесты там тоже принимают
            • 0
              я думаю они тоже не против и даже имеют это в планах ;-) или не имеют…
  • +3
    а куда пропали кавайные смайлики?
    • +5
      кончились х)
    • +2
      внутренний голос же запретил
    • 0
      habrahabr.ru/blogs/javascript/91003/ как думаешь, дело в смайлах?
      • +1
        неиначе. ну или просто рандом.
  • +6
    чувствую себя неимоверно тупым. объясните человеческим языком, что здесь произошло? :)
    • 0
      см ниже >_>
    • –1
      Я так понимаю оно вам и не надо )
  • +12
    фаербаг не показывает стектрейс, когда мы самостоятельно вызываем исключение. поэтому мы хитрожопым способом перехватываем такое исключение и показываем его самостоятельно
    • +2
      Отличное применение Long story short и демонстрация что из одной фразы можно сделать статью, умеючи :)
  • +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
                  и плачется кому ни попадя, как задолбало его быть гением %-)
                  • НЛО прилетело и опубликовало эту надпись здесь

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