Pokračujeme v našem seriálu o zpracování chyb v JavaScriptu a dnes se blíže podíváme na chybu Missing Parenthesis After Argument List
. Chyba Missing Parenthesis After Argument List
se může vyskytnout z různých důvodů, ale stejně jako většina chyb SyntaxErrors
se běžně objevuje při překlepu, chybějícím operátoru nebo nesprávném escapování řetězce.
V tomto článku se budeme chybou Missing Parenthesis After Argument List
zabývat trochu podrobněji, včetně toho, kam patří v hierarchii Exception
jazyka JavaScript a co je příčinou vzniku takových chyb. Tak jdeme na to!
Technický přehled
- Všechny chybové objekty JavaScriptu jsou potomky objektu
Error
nebo jsou jeho dědicem. - Objekt
SyntaxError
je dědicem objektuError
. - Chybový objekt
Missing Parenthesis After Argument List
je specifickým typem objektuSyntaxError
.
Kdy byste jej měli použít?
Jak bylo uvedeno v úvodu, chybový objekt Missing Parenthesis After Argument List
může vzniknout z různých důvodů. Většinou se problém týká překlepu nebo nějakého zapomenutého operátoru. Pro lepší ilustraci stačí prozkoumat několik jednoduchých příkladů:
Velmi typickou činností v jazyce JavaScript je concatenate
spojení více řetězců do jednoho většího. To lze provést pomocí jednoduchého operátoru +
mezi dvěma řetězci: console.log("Hello " + "world");
Nebo můžete řetězce spojovat také v řádku pomocí syntaxe zpětného křížku (`
) a závorek ({}
): console.log(`Hello ${worldVar}`);
Bez ohledu na způsob provedení přijímá mnoho metod jazyka JavaScript neurčitý počet argumentů (například řetězců), včetně metody console.log()
. V následujícím příkladu si všimněte, co se stane, pokud zapomeneme zahrnout jakoukoli formu spojování našich dvou řetězců:
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); }}
Výsledkem je, že okamžitě vyprodukujeme chybu Missing Parenthesis After Argument List
:
Uncaught SyntaxError: missing ) after argument list
Jak si můžete všimnout, předali jsme metodě console.log()
dva argumenty, ale neoddělili jsme je typickou čárkou (,
), ani jsme naše dvě řetězcové hodnoty nespojili dohromady pomocí jedné z výše uvedených metod. To způsobí, že JavaScript náš kód zpracuje v pořádku, dokud nedojde na konec prvního řetězce (is:"
) a nepřejde na další argument (name
). Protože jsme mu neřekli, aby spojoval, ani aby očekával další argument pomocí oddělovače čárky, JavaScript očekává, že je to konec našeho seznamu argumentů metody console.log()
, a zjistí, že naše uzavírací závorka chybí ()
), a vyhodí tedy chybu Missing Parenthesis After Argument List
.
Řešení závisí na tom, jak chceme, aby se náš kód choval, ale v tomto případě, protože předáváme argumenty metodě console.log()
, můžeme dosáhnout spojování přímo nebo prostým přidáním oddělovače čárky. Oddělovač čárkou je pro naše účely obecně čitelnější, takže zvolíme tuto možnost:
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); }}
Tím získáme výstup našeho jména podle očekávání:
Name is: Jane Doe
Je to jistě poměrně jednoduchá oprava, ale to je problém chyby Missing Parenthesis After Argument List
a SyntaxErrors
obecně. Všechny jsou tak zřejmé, jakmile je objevíte, ale pokud váš editor kódu neprovádí parsování a vyhodnocování syntaktických chyb za běhu, často je snadno přehlédnete, dokud si kód sami nevyzkoušíte.
Stojí také za zmínku, že stejně jako ostatní SyntaxErrors
nelze chybu Missing Parenthesis After Argument List
snadno zachytit pomocí typického bloku try-catch
. Protože se jedná o syntaktický problém, pokus o provedení problematického kódu v enginu JavaScript právě v tomto okamžiku selže. To obvykle znamená, že se nedostane do bodu provádění, kdy by mohl pokračovat k části bloku catch
, protože neví, jak ji správně analyzovat. To lze obejít posunutím provádění přes různé soubory a vrstvy, ale pro všechny základní záměry a účely je catching
SyntaxErrors
velkým problémem.
Chcete-li se ponořit ještě hlouběji do pochopení toho, jak se vaše aplikace vypořádávají s chybami JavaScriptu, vyzkoušejte revoluční nástroj Airbrake pro sledování chyb JavaScriptu, který v reálném čase upozorňuje na chyby a poskytuje okamžitý přehled o tom, co se v kódu JavaScriptu pokazilo.