I denne Quick Tip tar vi på run-time Error 2044, den ikke-behandlede IO-feilen. Det er faktisk veldig enkelt, men det plager selv erfarne utviklere, så vi vil gå i dybden og slå alle her i IO feil ninjaer.
La oss starte med å sette opp noen kode i en Flash-fil som produserer feil 2044. Opprett en ny AS3 Flash-fil, og skriv inn denne koden i Skriptpanelet:
var loader: Loader = ny Loader (); loader.load (ny URLRequest ("noen-ikke-eksisterende.url"));
Gå videre og kjør SWF, og du bør se denne feilen:
Feil # 2044: Uhåndtert IOErrorEvent :. text = Feil # 2035: URL ikke funnet.
Du vil se den samme feilen, med en liten variasjon hvis vi bare endrer loader
til URLLoader
, som i nedenfor:
var loader: URLLoader = ny URLLoader (); loader.load (ny URLRequest ("noen-ikke-eksisterende.url"));
Du bør se noe slikt, bare med filbanen som reflekterer miljøet ditt:
Feil # 2044: Ubehandlet ioError :. text = Feil # 2032: Strømfeil. URL: file: ////Volumes/Mac%20Pro/Users/dru/Library/Caches/TemporaryItems/non-existant.url på Untitled_fla :: MainTimeline / frame1 ()
Som du kanskje kan overtale fra det faktum at Feil 2044 går opp med loader
og URLLoader
i bruk har denne feilen noe å gjøre med lasting av eksterne filer.
Faktisk har feilen noe å gjøre med svikt å laste inn en ekstern fil. Som den falske nettadressen i kodene vil foreslå, er filen vi prøver å laste, et problem av noe slag. Sannsynligvis er det et tilfelle at filen ikke er tilgjengelig. dette kan ganske enkelt være en feilstavet nettadresse, eller en nettadresse som opprettes dynamisk, resulterer i en dårlig plassering, eller fordi serveren eller nettverket er nede i øyeblikket.
Feil 2044 anklager imidlertid ikke at du laster inn en dårlig fil. Det kommer til å skje. Vi kan ikke kontrollere nettverket, slik at en feil i feilen skal skje på et tidspunkt. Feil 2044 anklager deg for ikke å være forberedt på når det skjer.
Både loader
og URLLoader
er hendelsesdistribuere, som du burde vite fra å jobbe med dem. Du må bruke Event.COMPLETE
arrangement for å vite når en last er klar for deg å jobbe med den. Hvis du leser dette, skjønner du kanskje ikke at disse lasteklassene også sender andre hendelser, spesielt IOErrorEvent.IO_ERROR
begivenhet.
Når en loader
eller URLLoader
møter en feil, som beskrevet i forrige trinn, vil den sende en IOErrorEvent.IO_ERROR
begivenhet. Dette er en spesialisert hendelse for saker som dette. Den bærer en tekst
eiendom som beskriver feilens natur, sett i feilene vi opprettet i første trinn; begge kodestykker produserte feil 2044, men teksten til hver var forskjellig (selv om det var semantisk det samme).
I motsetning til de fleste hendelser, skjønt, når IOErrorEvent
s sendes, kontrollerer forsendelsen for eksistensen av minst én hendelseslytter. Hvis den ikke finner noen, kaster den ikke-behandlede IO-feilen.
Så løsningen er enkel: Bare legg til en lytter for IOErrorEvent.IO_ERROR
hendelse til lasteren din. Selv om lytteren ikke gjør noe, vil det i det minste undertrykke feilen 2044, i kraft av bare eksisterende.
var loader: URLLoader = ny URLLoader; loader.load (ny URLRequest ("noen-ikke-eksisterende.url")); loader.addEventListener (IOErrorEvent.IO_ERROR, onError); funksjon onError (e: IOErrorEvent): void // Ikke gjør noe
Husk at du legger til hendelser i contentLoaderInfo
tilhører loader
objekter, ikke til loader
direkte:
var loader: Loader = ny Loader (); loader.load (ny URLRequest ("noen-ikke-eksisterende.url")); loader.contentLoaderInfo.addEventListener (IOErrorEvent.IO_ERROR, onError); funksjon onError (e: IOErrorEvent): void // Ikke gjør noe
Imidlertid bør du være bedre forberedt enn dette, som en gutteskjærer; du vil ideelt sett bestemme hva en passende tiltak skal ta, og start deretter handlingen i hendelsesbehandlerfunksjonen. Du kan bestemme deg for å laste et bilde ikke funnet? bilde eller en standard XML-fil i stedet. Du kan presentere et varsel til brukeren som varsler dem om at en nødvendig ressurs ikke kunne lastes inn, og bør prøve igjen senere. Kanskje du også deaktiverer deler av SWF fordi de nødvendige dataene ikke kunne lastes inn. Du kan til og med fyre av en melding til en serverlogg med detaljer, slik at du kan se på situasjonen.
Som nevnt, er dette ganske enkelt, egentlig. Det er bare et spørsmål om å bli vant til å legge til hendelseshandleren i utgangspunktet, slik at du aldri ser feil 2044 igjen. Det forhindrer ikke ressursbelastning fra å feile, men det kan la deg degradere grasiøst og gjenopprette fra feilen så godt du kan.
Takk for at du leste. Jeg ser deg igjen snart i en annen Debug Quick Tip.