Az elnyelt hibaüzenetek és a Prototype
Aktívan használsz Prototype-ot, és olyan érzésed van, hogy nem kapod meg a JS hibaüzeneteket? Arról van szó, hogy a Prototype az Ajax.Request-nek átadott onComplete függvényt (és az egyéb callback-eket) egy
Ha találkoztál már ilyennel, akkor próbáld ki a megoldásom, melynek lényege, hogy a Prototype-os AJAX kérésekre bevezet egy eseménykezelőt, mely hiba esetén nem elnyeli, hanem újból kiváltja az eredeti hibát:A kis kiegészítő használata nagyon egyszerű, szúrd be a Prototype behúzása után bárhova, és utána ott láthatod majd mosolyogni a kivételeket a Firebug konzolján. :)
■ try...catch
blokk belsejéből hívja meg (ezzel szerintem eléggé megnehezítve a hibakeresést), s így a böngészőben semmi nyoma nem marad a hibának, és az oldal nem működik. Most vajon hol fogj hozzá a kereséshez?Ha találkoztál már ilyennel, akkor próbáld ki a megoldásom, melynek lényege, hogy a Prototype-os AJAX kérésekre bevezet egy eseménykezelőt, mely hiba esetén nem elnyeli, hanem újból kiváltja az eredeti hibát:
(
function() {
var origConstructor = Ajax.Request.prototype.initialize;
Ajax.Request.prototype.initialize = function(url, options) {
origConstructor.bind(this)(url, Object.extend(options, {
onException: function(_, exp) {throw exp}
}));
}
}
)();
Nem igazán értem
Persze, debug-hoz
Javascript-ben, ha egy egy kódrészhez nem definiálsz kivételkezelőt, akkor a böngésző kapja meg őket, ha definiálsz és nem dobott feljebb, akkor Te. Ez a prototype Ajax.Request-nél nem így van, mert ott az elnyelés az alapértelmezett, és akkor kell foglalkozni vele, ha meg akarod kapni vagy elő akarod idézni. Nem mondom, hogy ez rossz, szemlélet kérdése. Viszont akkor szerintem a többi függvénynek ill. funkciónak is így kellene működnie, ez így nem következetes.
Így jobban tetszik?
nos igen
Mondjuk nem állt szándékomban belekötni. Csak a weben - tapasztalataim szerint - azért annyira nem különül el a fejlesztési- és a publikálási szakasz, mint egy fordított program esetében. Így a felhasznált eszközök is általában inkább a debug- és nem debug-módokat támogatják.
Egy nagyobb projektnél meg végképp szükséges (megint csak szerintem), hogy egy darab jelzővel lehessen ki- és bekapcsolni pl a debug módot, vagy a logolást, s ne N+1 helyen kelljen beleirogatni.
Persze, ha amúgy compile-szerűen nyomja ki az ember a release-t (pl. mert jsmin-nel végigtolja a JS fájlokat), akkor ez nem annyira érdekes.