Fortsætter vi vores serie om håndtering af JavaScript-fejl, skal vi i dag se nærmere på JavaScript-fejlen Missing Parenthesis After Argument List
. Missing Parenthesis After Argument List
-fejlen kan opstå af mange forskellige årsager, men ligesom de fleste SyntaxErrors
opstår den ofte, når der er en tastefejl, en operatør mangler, eller en streng ikke er escapet korrekt.
I denne artikel vil vi undersøge Missing Parenthesis After Argument List
-fejlen lidt nærmere, herunder hvor den passer ind i JavaScript Exception
-hierarkiet, og hvad der forårsager sådanne fejl. Af sted med dig!
Den tekniske gennemgang
- Alle JavaScript-fejlobjekter er efterkommere af
Error
-objektet eller et arvet objekt heri. -
SyntaxError
-objektet arves fraError
-objektet. - Den
Missing Parenthesis After Argument List
-fejl er en specifik typeSyntaxError
-objekt.
Hvornår skal du bruge det?
Som nævnt i indledningen kan Missing Parenthesis After Argument List
-fejlen opstå af en række forskellige årsager. Oftest er problemet relateret til en skrivefejl eller en glemt operatør af en eller anden art. For bedre at illustrere dette kan vi blot undersøge et par enkle eksempler.
En meget typisk handling i JavaScript er at concatenate
flere strenge sammen for at danne én større streng. Dette kan udføres ved hjælp af en simpel +
-operator mellem to strenge: console.log("Hello " + "world");
Og du kan også sammenkæde strenge inline ved hjælp af backtick- (`
) og parentes- ({}
) syntaks: console.log(`Hello ${worldVar}`);
Uanset hvordan det gøres, accepterer mange JavaScript-metoder et ubestemt antal argumenter (f.eks. strenge), herunder console.log()
-metoden. I eksemplet nedenfor kan du se, hvad der sker, hvis vi glemmer at medtage nogen form for sammenkædning for vores to strenge:
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); }}
Resultatet er, at vi straks producerer en Missing Parenthesis After Argument List
-fejl:
Uncaught SyntaxError: missing ) after argument list
Som du måske bemærker, har vi overgivet to argumenter til console.log()
, men vi har ikke adskilt dem med et typisk komma (,
), og vi har heller ikke sammenkædet vores to strengværdier med en af de ovennævnte metoder. Dette får JavaScript til at analysere vores kode helt fint, indtil den når slutningen af den første streng (is:"
) og går videre til det næste argument (name
). Da vi ikke har fortalt den, at den skal sammenkæde eller forvente endnu et argument ved hjælp af en kommaseparator, forventer JavaScript, at det er slutningen af vores argumentliste til console.log()
-metoden, og finder ud af, at vores lukkende parentes mangler ()
), hvilket giver en Missing Parenthesis After Argument List
-fejl.
Løsningen afhænger af, hvordan vi ønsker, at vores kode skal opføre sig, men i dette tilfælde, fordi vi overfører argumenter til console.log()
, kan vi opnå sammenkædning direkte eller ved blot at tilføje en kommaseparator. Kommaadskilleren er generelt mere læsbar til vores formål, så lad os vælge den mulighed:
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); }}
Det giver os vores navneoutput som forventet:
Name is: Jane Doe
En ret simpel rettelse, ganske vist, men det er problemet med Missing Parenthesis After Argument List
-fejlen og med SyntaxErrors
generelt. De er alle så indlysende, når de først er opdaget, men medmindre din kodeeditor analyserer og evaluerer din kode for syntaksfejl i farten, er det ofte let at overse dem, indtil du selv afprøver koden.
Det er også værd at bemærke, at Missing Parenthesis After Argument List
-fejlen, ligesom andre SyntaxErrors
, ikke let kan fanges af den typiske try-catch
-blok. Da problemet er syntaks, mislykkes JavaScript-motorens forsøg på at udføre den problematiske kode netop på det tidspunkt. Det betyder normalt, at den ikke når det punkt i udførelsen, hvor den kan fortsætte til catch
-delen af blokken, da den ikke ved, hvordan den skal analysere den korrekt. Dette kan omgås ved at forskyde udførelsen gennem forskellige filer og lag, men for alle grundlæggende formål er catching
SyntaxErrors
en stor udfordring.
For at dykke endnu dybere ned i forståelsen af, hvordan dine applikationer håndterer JavaScript-fejl, kan du tjekke det revolutionerende Airbrake JavaScript-fejlsporingsværktøj, der giver dig advarsler i realtid og øjeblikkelig indsigt i, hvad der gik galt med din JavaScript-kode.