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 aError
objektumtól öröklődik. - A
Missing Parenthesis After Argument List
hiba aSyntaxError
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.