JavaScript hibakezelés:

A JavaScript hibakezelési sorozatunk folytatásaként ma a Missing Parenthesis After Argument List JavaScript hibát vizsgáljuk meg közelebbről. A Missing Parenthesis After Argument List hiba számos okból előfordulhat, de a legtöbb SyntaxErrors-hez hasonlóan általában akkor bukkan fel, ha elírás történt, hiányzik egy operátor, vagy egy karakterláncot nem megfelelően eszkábáltak.

Ebben a cikkben a Missing Parenthesis After Argument List hibát vizsgáljuk meg egy kicsit részletesebben, beleértve azt is, hogy hol helyezkedik el a JavaScript Exception hierarchiában, és mi okozza az ilyen hibák előfordulását. Away we go!

A technikai áttekintés

  • Minden JavaScript hibaobjektum a Error objektum leszármazottja, vagy annak egy örökölt objektuma.
  • A SyntaxError objektum a Error objektumtól öröklődik.
  • A Missing Parenthesis After Argument List hiba a SyntaxError objektum egy speciális típusa.

Mikor kell használni?

Amint a bevezetőben említettük, a Missing Parenthesis After Argument List hiba többféle okból is előfordulhat. Legtöbbször a probléma egy elíráshoz vagy valamilyen elfelejtett operátorhoz kapcsolódik. Hogy ezt jobban szemléltessük, vizsgáljunk meg néhány egyszerű példát.

A JavaScriptben nagyon tipikus művelet, hogy concatenate több karakterláncot concatenate összevonunk, hogy egy nagyobb karakterláncot alkossunk. Ezt egy egyszerű + operátorral végezhetjük el két karakterlánc között: console.log("Hello " + "world");

Vagy pedig soron belül is összefűzhetünk stringeket, a backtick (`) és a zárójel ({}) szintaxis használatával: console.log(`Hello ${worldVar}`);

Függetlenül attól, hogy hogyan történik, sok JavaScript-módszer határozatlan számú argumentumot (például karakterláncokat) fogad el, beleértve a console.log() módszert is. Az alábbi példában figyeljük meg, mi történik, ha elfelejtjük a két karakterláncunk bármilyen formájú összekapcsolását:

var printError = function(error, explicit) { console.log(` ${error.name}: ${error.message}`);}try { var name = "Jane Doe"; console.log("Name is:" name);} catch (e) { if (e instanceof SyntaxError) { printError(e, true); } else { printError(e, false); }}

Az eredmény az, hogy azonnal egy Missing Parenthesis After Argument List hibát produkálunk:

Uncaught SyntaxError: missing ) after argument list

Amint észrevehetjük, két argumentumot adtunk át a console.log()-nak, de nem választottuk el őket a szokásos vesszővel (,), és nem is kapcsoltuk össze a két string értékét a fenti módszerek egyikével. Ez azt eredményezi, hogy a JavaScript remekül elemzi a kódunkat, egészen addig, amíg el nem éri az első string végét (is:"), és át nem lép a következő argumentumra (name). Mivel nem mondtuk meg neki, hogy kapcsolja össze, és azt sem, hogy vesszőelválasztó használatával várjon egy másik argumentumot, a JavaScript azt várja, hogy ez lesz az console.log() módszerhez tartozó argumentumlistánk vége, és úgy találja, hogy hiányzik a záró zárójelünk ()), így Missing Parenthesis After Argument List hibát dob.

A megoldás attól függ, hogyan szeretnénk, hogy a kódunk viselkedjen, de ebben az esetben, mivel a console.log()-nak adunk át argumentumokat, közvetlenül vagy egyszerűen egy vesszőelválasztó hozzáadásával érhetjük el az összefűzést. A vesszőelválasztó általában olvashatóbb a mi céljainkra, ezért válasszuk ezt a lehetőséget:

var printError = function(error, explicit) { console.log(` ${error.name}: ${error.message}`);}try { var name = "Jane Doe"; console.log("Name is:", name);} catch (e) { if (e instanceof SyntaxError) { printError(e, true); } else { printError(e, false); }}

Ezzel megkapjuk a név kimenetét a várt módon:

Name is: Jane Doe

Egy meglehetősen egyszerű megoldás, az biztos, de ez a probléma a Missing Parenthesis After Argument List hibával, és általában a SyntaxErrors hibával. Ezek mind olyan nyilvánvalóak, ha egyszer felfedezzük őket, de hacsak a kódszerkesztőnk nem elemzi és értékeli a kódot a szintaktikai hibákra menet közben, gyakran könnyű nem észrevenni őket, amíg nem teszteljük a kódot magunk.

Azt is érdemes megjegyezni, hogy a többi SyntaxErrors-hez hasonlóan a Missing Parenthesis After Argument List hibát sem lehet könnyen megragadni a tipikus try-catch blokkal. Mivel a probléma szintaktikai, a JavaScript-motornak a problémás kód futtatására tett kísérlete pontosan ebben a pillanatban bukik el. Ez általában azt jelenti, hogy nem jut el a végrehajtásban arra a pontra, ahol a blokk catch részével folytatódhat, mivel azt nem tudja helyesen elemezni. Ezt meg lehet kerülni a végrehajtás különböző fájlokon és rétegeken keresztül történő áthelyezésével, de minden alapvető szándék és cél szempontjából a catching SyntaxErrors komoly kihívást jelent.

Ha még mélyebbre akar merülni annak megértésében, hogy az alkalmazásai hogyan kezelik a JavaScript hibákat, nézze meg a forradalmi Airbrake JavaScript hibakövető eszközt, amely valós idejű riasztásokat és azonnali betekintést nyújt abba, hogy mi romlott el a JavaScript kódjával.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.