ugrás a tartalomhoz

js globális on error continue

zzrek · 2011. Már. 1. (K), 12.42
Sziasztok!

Légyszi erősítsetek meg ebben: tényleg nincs lehetőség a javascriptben arra, hogy globálisan megadhassam, hogy hiba esetén folytatódjon a futás a következő paranccsal?

Köszi!
 
1

Van

janoszen · 2011. Már. 1. (K), 12.53
A JavaScriptben minden hiba exceptionként fut, tehát azt el is tudod kapni. Az event handlereknél nyilván probléma van, de ha a definiálásukkor becsomagolod őket egy try-catch blokkba, akkor ott sem lesz gond. Ezen felül érdemes még megnézni a window.onerror-t, de az csak néhány böngészőben működik.
2

nem értem félre

zzrek · 2011. Már. 1. (K), 13.36
Remélem nem értettem félre amit mondasz.
Valami olyanra gondoltam mint a window.onerror, tehát globálisan definiálható hibakezelő (nem tehetek minden sorra try-catch blokkot), csak azt szeretném, hogy (a hiba kielemzése után stb) legyen lehetőség rá, hogy folytatódjon végrehajtás, mintha nem is lett volna hiba.
Pl. ha egy ciklus belsejében van egy hiba, akkor a ciklus folytatódjon, stb.

for (i=0;i<10;i++)
{
 alert(1);
 alkert("ez hiba");
 alert(2);
}
Szóval legyen 20 alertem ebből.

Ugye ilyesmit nem lehet csinálni?

(Találtam olyan trükköt a neten, hogy végigszaladt az összes eljáráson és try-catch blokkba csomagolta őket, na ezért gondoltam hogy nemigazán van támogatva a globális hibakezelés, csak épp nem lenne rossz, ha mégis lenne)
3

Nem

Poetro · 2011. Már. 1. (K), 13.44
Ilyesmit nem lehet. Egy jó lint eszköz (JSLint, JSHint) valamint unit tesztelés az ilyen jellegű hibákat ki tudja szűrni, még azelőtt, hogy éles környezetbe kerülne a kód.
4

Köszönöm

zzrek · 2011. Már. 1. (K), 15.25
Köszönöm a megerősítést, legalább nem keresgélek tovább.
(Ez IE mindig meg tud lepni, vagy egyes böngésző kiterjesztések, nyilván sok lehetőséget kiszűrtem, ez arra lenne jó, hogy az éles (vagy béta) környezetben mégis előforduló - egyébként valószínűleg nem fatális - hibák ne akasszák meg a munkamenetet és logolva legyenek, hogy egyáltalán rájöjjek, hogy mi okozhatta és reagálni tudjak rá)
5

Ne csinálj hibát, és akkor

inf · 2011. Már. 1. (K), 16.59
Ne csinálj hibát, és akkor nem kell lekezelni ;-) Nem hiszem, hogy sűrűn előfordulna ilyesmi, ha mégis muszáj, akkor írj valami saját metódust rá, pl:

Array.prototype.tryEach=function (method,onError,context)
{
	if (!context)
	{
		context=this;
	}
	for (var i=0,l=this.length; i<l; ++i)
	{
		try
		{
			method.call(context,this[i],i);
		}
		catch(e)
		{
			onError && onError.call(context,e);
		}
	}
};
Az, hogy maga a kód folytatódjon esélytelen... Nem ismerek olyan nyelvet, amiben erre lehetőség van (mondjuk nem ismerek valami sokat). Szerintem ez az egész értelmetlen, mmint az egymást követő sorok a legtöbb kódban egymásra épülnek, szóval ha hiba van az egyik sorban, akkor az az összes azt követőben hibát okoz. Szerintem nem sűrű az olyan "globális hibakezelés", ahol folytatódik a függvény futása.
6

köszi

zzrek · 2011. Már. 1. (K), 22.25
Furfangos kis kódot mutattál, kicsit gondolkodnom kellett rajta, hogy mit is akarsz ezzel, köszi ;-)
Nos, ha képes vagy megoldani hogy folytatódjon a kód hiba esetén, akkor eleve úgy gondolkozol, hogy ez egy lehetőség. Nem mindig a te kódod okozza a hibát, és nem mindig kardinális dologról van szó. Pl. ha jól emlékszem az Opera akkor is hibát dob, ha olyan CSS tulajdonságot állítasz be, amit nem ismer. Persze az ilyenekre előre fel lehet készülni, és egyszerűbbnek és szebbnek is hangzik, de bizonyos esetekben hasznos lehet, és egyszerűsítheti a hiba megtalálását. Nyilván nem mindig érdemes továbbengedni a futást, de azért az nem olyan rossz, ha mint lehetőség, ez a programozó kezében van.
Pusztán kíváncsi voltam, hogy JSben jól látom-e hogy ez nem megvalósítható, nyilván minél hamarabb ez kiderült, annál hamarabb kiverhettem a fejemből és így most kereshetek más megoldást.

Köszi a tippeket!
7

Ja furfangos, mert elírtam

inf · 2011. Már. 2. (Sze), 02.34
Ja furfangos, mert elírtam :D

A használata, ha nem lenne világos:

([{a:0},1,{a:2}]).tryEach(function (item)
{
	alert(item.a);
},function (e)
{
	alert(e);
});

//0,exception,2