160 likes | 316 Views
Web-programmering. Feilhåndtering i PHP. I dag. Feilhåndtering i PHP Bruke dette videre i faget Gjennomgang av kode. Oppgaveløsning Oblig 1 leveres 6. mars Ingen lab på torsdag (næringslivsdag) Ingen forelesning neste uke (undervisningsfri) Lab går som vanlig neste uke.
E N D
Web-programmering Feilhåndtering i PHP
I dag • Feilhåndtering i PHP • Bruke dette videre i faget • Gjennomgang av kode. • Oppgaveløsning • Oblig 1 leveres 6. mars • Ingen lab på torsdag (næringslivsdag) • Ingen forelesning neste uke (undervisningsfri) • Lab går som vanlig neste uke.
Feilhåndtering i PHP • I en ”ordentlig” web-applikasjon må alle feil håndteres av programmet • Ingen feil skal skrives ut av php • Warning : fopen(logg.txt) : failed to openstream… • Ingen feil skal gjøre at programmet stopper • Feilmeldinger skal vises til brukeren slik at de kan forstå feilen • Videre bør feil ”logges” til fil • Administrator kan så se alle feil i produksjon
Warning : fant ikke filen som skulle skrives til. • Ikke brukervennlig!
Første steg: Test på feilsituasjoner der du kan! • Mange PHP funksjoner returnerer verdier (som oftest true/false) avhengig om det gikk ok eller ikke. • Dersom disse returverdier ikke testes på skrives det ut en warning i nettleseren • Dette ønsker vi ikke • Test derfor på retur av PHP funksjoner der det er mulig (f.eks ved filhåndtering).
Andre steg : å logge feil • I reelle driftssituasjoner med mange brukere • Administrator må vite om feil i systemet • Feilene må ikke bare gå til brukerne • Kan bruke en PHP funksjon : • error_log(”Feilmelding”,3,”Logg.txt”); • 2. parameter: • 1: Sendes til mailadresse (forsiktig: kan føre til mange mail) • 3 : Sendes til fil
Logger feil til fil i tillegg til å skrive ut melding til bruker
Tredje steg: Ikke vis feil • Det er ingen garanti for at du har skrevet inn tester der for det er behov for det. • For å unngå systemmeldinger til bruker: • error_reporting(0); eller E_ALL, E_ERROR etc. • Med 0 : Ingen warning vil bli vist bruker uansett! • Må ha en generell mekanisme for å fange opp feil (warnings) som programmet ikke tester på
Tredje step fort: • En generell php funksjon sikrer dette • set_error_handler(funksjonsnavn,E_TYPE); • funksjonsnavnet angir en funksjon som utføres ved ulike typer feil (skrevet av deg) • E_TYPE = E_ALL|E_ERROR|E_WARNING|E_USER_ERROR • Inne i funksjonen som er angitt i error handler • Bygg en meldning og skriv denne til fil
Set_error_handler • $errno = feilnummer fra systemet • $errstr = feilmeldingen • $errfile = filen som genererte feilen • $errline = linjenummeret som feilen oppstod i
Fjerde steg : Fatale feil • Fatal errors stopper hele kjøringen av en fil • Også disse bør brukeren forskånes for • Også disse feilene bør logges til en fil • I tillegg bør brukeren dirigeres til en ”feilside” hvor det vises en brukervennlig melding • Som forklarer at applikasjonen har stoppet, feilen er logget og at brukeren må starte på nytt.
Mål at ingen slike meldinger skal oppleves av brukeren i ”produksjon”
For å håndtere fatale feil • Egen php funksjon som utføres før scriptet avsluttes: • Register_shutdown_function(avsluttFunksjon) • Parameteren avsluttFunksjon (NB ingen ” ” her!) angir hvilken egendefinerte funksjon som skal kalles ved fatale feil
Shutdownfunction • Funksjonen henter siste feilmelding (error_get_last) • Bygger en melding med et linjeskift ($message) • Skriver til logg fil(error_log) • Går til en ny side som viser en brukervennlig feilmelding (header(”Location:url”))
Try, throw, catch • Er ikke spesielt nyttig da man må eksplisitt kaste (throw) alle feil og fatale feil håndteres ikke. try { $filhandler = fopen("test.txt","r"); if($filhandler==NULL) thrownewException; } catch (Exception $e) { echo "Feil".$e->getMessage(); }