Quick Tips: Hvordan feilsøke en AS3 Feil # 1063

Quick Tips: Hvordan feilsøke en AS3 Feil # 1 063
to
Del
Del
Share < .no> Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av
Dette innlegget er en del av en serie som heter Hvordan fikse bugs i Flash.Quick. Tips: Hvordan feilsøke en AS3 Feil # 1009Quick Tips: Hvordan feilsøke en AS3 Feil # 2044

Det er på tide for en annen debugging Quick Tips. Vi vil fortsette vårt fokus på konkrete (og vanlige) feil som pleier å stymie mindre erfarne ActionScripters. I dette tilfellet, vil vi dekke Feil # 1063, argumentet teller mismatch feil



Trinn 1:. Å være Bad

Først, la oss skape en situasjon der feilen oppstår. Åpne opp en ny Flash-dokument (forutsatt at du følger med Flash Pro CS3 +, ellers denne prøven er lett tilpasses til en Flex prosjekt). Åpne Script Editor og oppgi følgende kode:
import flash.events.MouseEvent; funksjon onClick (): void {trace (". Klikk på");} stage.addEventListener (MouseEvent.CLICK, onClick);

Du kan sikkert få øye på problemet allerede; hvis du har brukt noe tid å skrive Actionscript 3 du har funnet deg selv å skrive hendelsesbehandlinger. Hvis ikke, føler ikke dårlig - vi vil gå over det hele etter hvert

Hvis du kjører Flash-filen som er, og klikk deretter på scenen, vil du produsere følgende løp. -time feilmelding:
ArgumentError: Feil # 1063: Argument count mismatch på Untitled_fla :: MainTimeline /onClick (). Forventet 0, fikk 1.

Og vi aldri komme til spor uttalelse at bør
har kjørt etter å ha klikket



Trinn 2:. Å bryte det ned

Så hva er det som skjer? I dette tilfellet er Adobes ordgyteri for feilen faktisk ikke så ille, og hvis du har blitt vant til å parsing en kjøretids feilmelding, kan betydningen være ganske klart. Men ikke alle er like smart som deg, så her er det sammenbrudd for alle andre

ArgumentError -. Dette er noe ubetydelig informasjon, men det viser den spesifikke Feil klassen som ble kastet. Vi har noe som ikke er så generelt som en enkel feil, og vi har gått inn i en bestemt kategorisering av feil i forbindelse med argumenter (til funksjoner og metoder)

Feil # 1063 -. Her er vi bare gi den formelle feil nummer, som alle gode kjøre-time feil. Du kan bruke denne koden for å lettere finne det i Adobes kjøretidsfeil dokumentasjon

Argument count mismatch ... -. I mer proletariske vilkår, det var feil antall argumenter som sendes til en funksjon. Hvilken funksjon? Det er ...

... på Untitled_fla :: MainTimeline /onClick (). - Dette identifiserer bare funksjonen som fikk feil antall argumenter

Forventet 0, fikk 1. -. Vi får litt ekstra informasjon i denne feilbeskrivelse. Dette detaljer tellingen mismatch. Denne setningen vil endres i henhold til arten av den spesifikke feilen, men i vårt tilfelle er det å si at funksjonen ble skrevet uten argumenter i signaturen, men et enkelt argument fikk sendt til den likevel.

Flash liker sin ender i en rad. Så merker det dette avviket og bestemmer seg for å kaste en raserianfall feil, fordi det ville heller du (utbygger) funnet ut hva som gikk galt enn at du bare ignorert problemet. Dette er bra, fordi hvis antallet mismatch gikk den andre veien (forventet en, fikk 0), da ville vi bli sittende fast uten et argument for en nødvendig parameter, og funksjonen vil gjøre Dog vet hva.



Trinn 3: roten av problemet

Naturen av feilen skal være klar på dette punktet, men du kan fortsatt lurer på hvorfor det skjedde i det hele tatt. Hvor kom den overflødige argument kommer fra?

Argumentet er ikke akkurat overflødig. Det er forventet, faktisk, siden vi har koblet opp vår funksjon å være en hendelse lytteren. Arrangementet system i Flash har forestillingen om en event objektet Hotell som omslutter aspekter av hendelsen som skjedde. Dette objektet blir sendt til lytteren funksjon som den eneste argument. Så vi forventet 0 fordi vi skrev vår funksjon uten parametre, men vi fikk en fordi hendelsen sentralen sendte langs en hendelse objekt.

Nå lurer du kanskje på hvorfor kompilatoren ikke ta denne feilen. Det er sant: hvis du skrev dette:
funksjonen sayClick (): void {trace (". Klikk på");} sayClick (42);

Da SWF vil ikke engang kompilere, fordi du vil få dette error:
1 137: Feil antall argumenter. Forventet ikke mer enn 0.

Forskjellen er at i sistnevnte eksempel har vi selve koden som kaller funksjonen med feil antall argumenter. Det vil si, vi skrev linjen ned som kaller funksjonen feil. Kompilatoren kan se på linjen som definerer funksjonen, og den linjen som kaller funksjonen, og sammenligne dem for avvik, og slå alarm når de oppstår.
Bilde av Alan /Falcon

Men i den opprinnelige eksempel er det ingen kodelinje nedskrevet som bokstavelig talt kaller funksjonen ved navn. I stedet er den funksjon som kalles ved referanse. Når vi legger arrangementet lytteren, vi passerer i funksjonen, og på det punktet er det en variabel, ikke et funksjonskall. Denne referansen blir lagret av hendelsen sentralen, og deretter henrettet dynamisk når hendelsen oppstår (som er en ekte high-nivå oversikt over hvordan arrangementet systemet fungerer, men vi har ikke tid til å gå dypere). Så, er kodelinje som til slutt kaller feil forårsaker funksjon en ganske generisk linje med kode som bruker indirekte for å få jobben gjort, og derfor noe mye vanskeligere for kompilatoren å fange.

(Etter min mening, kunne Adobe minst registrere addEventListener linje ved kompilering, og gå på jakt etter den funksjonen referansen ved navn. Hvis den finner et treff, kan det kontrollere funksjonen signatur for en skikkelig event argument, og gi feil tilsvarende. Det fortsatt ikke kunne gjøres på en idiotsikker måte, men det kan gå en lang vei å fange disse feilene før de faktisk kjører SWF.

Hovedpoenget er imidlertid at dette kjøretids error har en compile-time motpart, men at kjøretidsfeil oppstår når funksjonen kalles ved referanse og ikke direkte etter navn



Trinn 4:. Fixing Hole

Regnet er å få i når vi kaller funksjonen som referanse, og har et avvik i antall argumenter Vi har vanligvis to alternativer:. vi kan endre den, eller endre funksjonens argumenter. I dette eksempelet, kan vi ikke endre den, så det skjer inne EventDispatcher, kode som vi ikke har tilgang. Det etterlater oss med å endre argumentene.

Dette, igjen, har to alternativer. Først kan vi bare legge argumentet. Denne linjer opp antall argumenter og fra her på ut, vil alt være copacetic. Vi trenger ikke å bruke argumentet, vi trenger bare å ha funksjonen "fange" det når det heter
funksjon onClick (e: MouseEvent):. Void {

Det andre alternativet er å, igjen, legger argumentet (ingen vei rundt det, er jeg redd). Men hvis du opprinnelig skrev den fungere som en vanlig funksjon og ikke en hendelse lytteren, og kaller det fra andre steder i koden din uten argumenter, kan du sette pris på denne varianten. Gjøre argumentet valgfritt, og standard det til null:
funksjon onClick (e: MouseEvent = null): void {

Dette vil fungere godt med arrangementet system: det blir sendt en hendelse objekt og kan fange den. Det fungerer også godt sammen med den eksisterende koden; hvis ingen argument er sendt, er parameteren standard brukt og funksjons inntektene



Trinn 5:. Tilbakering

Merk at denne feilen ikke er begrenset til hendelsen lyttere, selv om det er trolig den vanligste sammenheng hvor du vil oppleve det. Til syvende og sist er det ved hjelp av funksjoner som er lagret i variabler, i motsetning til kalt ved navn, som fører til feilen. Dette er hvordan arrangementet systemet fungerer. Vi kan bearbeide den opprinnelige eksempel for å produsere mer eller mindre den samme feilen, bare uten klikk:
funksjon sayMyName (navn: String): void {trace ("Hello," + navn);} Var funcRef: Function = sayMyName; funcRef ();

Igjen, vi kommer forbi kompilator feil fordi vi har et lag av indirekte mellom funksjonsdefinisjonen og funksjon samtale. Dermed får vi kjøretidsfeil (forventet en, fikk 0).

Det er ikke alltid dette kuttet og tørr, though. Hvis du benytter callbacks i koden din, kan du faller byttedyr til feil 1063. Tilbakering er liksom som hendelsen lyttere, bare det ikke er noen formell, innebygd mekanisme for å implementere dem. De er i utgangspunktet bare fungerer du passerer rundt ved henvisning, som lagres (enten midlertidig eller langsiktig) av en annen prosess, som deretter kaller tilbakeringingsfunksjonen på riktig tidspunkt.

tweening motorer vanligvis implementere disse . Noen går for en mer formell hendelsesstyrt system, men TweenLite, for eksempel, bruker tilbakeanrop for å motta varslinger om tween fremgang. Denne linjen:
TweenLite.to (someClip, 1, {onComplete: tweenFinished, onCompleteParams: [42, "svar"]});

... vil kalle en funksjon som heter tweenFinished på slutten av tween, bestått i to parametere til funksjonen. Denne teknikken er i siste instans mer fleksibel da hendelser, som du ikke er begrenset til bare enkelt hendelse objekt som parameter. Men det gir seg til lignende sårbarheter for feil 1 063 på grunn av beskaffenheten av bestått funksjoner rundt som referanse.



Det er alt

Som brytes opp en annen Debugging Quick Tips. Takk for lesing, og jeg håper du har lært noe underveis!