JavaScript

индекс
246,46

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

— Здравствуй, дружок…
— Дяденька, вы снова расскажете мне сказку?
— Конечно! Какой умненький мальчик!
— А про что?
— М… сегодня я расскажу тебе о том, куда пропадают чересчур самостоятельные мальчики вроде тебя…
— Э! Что значит пропадают?
— Вот то и значит… На, держи огнелиса *протянул, держа за хвост, пылающее пламенем животное* Только осторожно — он горячий!
— Ай-ай-ай! Он брыкается!
— Посади на него огненного жука — мигом успокоится.
— Класс! Действует!
— Ато! Теперь скажи ему:
function throwException( ){ (void 0)() } throwException()
— Он ругается!
— Именно, когда он слышит что-то непонятное, то начинает поливать тебя стектрейсами. А теперь скажи:
function throwError( ){
    throw new Error( 'error' )
}
throwError()
— Что-то буркнул и всё.
— Угу, тут ему видите ли лень трейсануть в тебя стек.
— Как же тогда быть? Иногда же бывает нужно сказать что-нибудь эдакое…
— Дай-ка его сюда… *шепчу ему на ушко мантру*
var Error= new function( Original ){

Version: 1
Description: "repairs mozilla's stacktrace in custom errors"
License: 'public domain'

Implementation:

var Error= ( window.console && Original && ( new Original ).stack )
function( message ){
        var e= new Original( message )
        var custom= function( msg, file, line ){
            restore()
            if( other && other.apply( this, arguments ) ) return true
            if(( e.message != msg )||( e.fileName != file )||( e.lineNumber != line )) return
            var stack= e.stack.split( '\n' )
            stack= stack.slice( 2, stack.length - 1 )
            stack[0].replace( /^.*\(.+?\)@(.+):(\d+)$/, function( str, file, line ){
                e.fileName= file
                e.lineNumber= Number( line )
            })
            stack[ stack.length - 1 ]= stack[ stack.length - 1 ].replace( /^@.+:\d+$/, function( str ){
                return 'source file()' + str
            })
            e.stack= stack.join( '\n' )
            console.error( e )
            return true
        }
        var other= window.onerror
        var restore= function(){
            if( window.onerror === custom ) window.onerror= other
        }
        window.onerror= custom
        setTimeout( restore, 1 )
        return e
    }
:  Original

Export: return Error

Usage: throw new Error( 'custom error' )

}( window.Error )
— Что вы там шепчете ему?
— Не важно. Повтори теперь ему, что говорил ранее.
— Нихерасебе! Вот это трейсанул так трейсанул! В чём секрет?
— Ха! Это особая, уличная магия! Скажем так: я смог его убедить, что стектрейс очень важен для нас.
— М… ладно, понятно, а причём тут исчезновение мальчиков?
— А… да… пошли к дяде Хрому, мой маленький Стэк, он всё объяснит…
+71
11 марта 2010, 03:19
47

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

+18
rdolgov #
В таком стиле даже неинтересные вещи читать прикольно. осилил без напрягов.
–1
Ringess #
однозначно) кул
+1
art008 #
да ну, как-то беспонтово и жеманно
+5
homm #
Ну а что там с хромом?
–17
Andrey_Rogovsky #
С хромом ок
Не юзаю, но одобряю
+4
tenshi #
а хром не выводит стектрейс в консоль. только в режиме пошаговой отладки
+1
Guria #
0
tenshi #
это не баг…
+1
Guria #
я не против. фичреквесты там тоже принимают
0
tenshi #
я думаю они тоже не против и даже имеют это в планах ;-) или не имеют…
+3
dpigo #
а куда пропали кавайные смайлики?
+5
tenshi #
кончились х)
+2
MegafonUral #
внутренний голос же запретил
0
tenshi #
habrahabr.ru/blogs/javascript/91003/ как думаешь, дело в смайлах?
+1
dpigo #
неиначе. ну или просто рандом.
+6
Aralot #
чувствую себя неимоверно тупым. объясните человеческим языком, что здесь произошло? :)
0
tenshi #
см ниже >_>
–1
rdolgov #
Я так понимаю оно вам и не надо )
+12
tenshi #
фаербаг не показывает стектрейс, когда мы самостоятельно вызываем исключение. поэтому мы хитрожопым способом перехватываем такое исключение и показываем его самостоятельно
+2
smartov #
Отличное применение Long story short и демонстрация что из одной фразы можно сделать статью, умеючи :)
–1
tenshi #
что это такое? о_0"
+1
smartov #
0
tenshi #
ну да х)))
+3
MaximG #
почему-то текст в голове прочитался голосом мистера Фримена :)
+4
DoctorChaos #
Фримен когда-то разговаривал? о_О
+2
MaximG #
вот этот мистер: mf0.me
–1
tenshi #
тсс! не пали контору! ._."
0
tenshi #
да, во второй части
+2
tenshi #
блин >_<" и я перепутал его с гордоном…
+2
SeLarin #
Мистер Фримен разговаривает вот уже 58 выпусков. Только его иногда путают с молчуном Гордоном… :)
+1
Recluse #
Не Гордон Фриман (:
+2
Recluse #
Обновляй комментарии!
+1
bga #
Материал ниразу не нов.
Читайте eriwen.com/javascript/js-stack-trace/ кто силен в английском. Это истоки.
Еще автор на знает ни метод через caller, ни для оперы не указал.
Кроме интересной подачи тут ничего ценного нет лично для меня.
Все ИМХО.
+1
tenshi #
там ниразу не об этом х) там кроссбраузерно печатается стектрейс, а тут исправляется баг в конкретном браузере
но спасибо за ссылку
–4
bga #
Ах сорри. Привычка проглядывать топики а не читать.
+1
youROCK #
Кстати, лучше не запускать код

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

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

Или положить в стек этот адрес и retf, что одно и тоже в данном контексте.
+1
Aux #
Возможно ljmp 0, 0 (ваш войд) имеет смысл на платформах отличных от x86, тогда вы действительно могли видеть этот код в исходниках под другую платформу.
+1
youROCK #
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
semper #
Есть здесь граммар наци? Нужна ваша поддержка.
Автор отказывается ставить пробел в слове «Ато» :)
+1
tenshi #
нихачу! нибуду! *топнул ногой и встал в гордую позу*
+1
glazs #
Красиво код оформлен, кстати.
НЛО прилетело и опубликовало эту надпись здесь
+1
tenshi #
ему же потом кошмары сниться будут! х)
НЛО прилетело и опубликовало эту надпись здесь
+1
tenshi #
лучше быть счастливым быдлом, чем сумасшедшим гением ;-)
НЛО прилетело и опубликовало эту надпись здесь
+1
tenshi #
не согласится… и будет себя страстно ненавидить за эту свою принципиальность х)
НЛО прилетело и опубликовало эту надпись здесь
+1
tenshi #
и плачется кому ни попадя, как задолбало его быть гением %-)
НЛО прилетело и опубликовало эту надпись здесь

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