Stabil drift og brugeroplevelse

Fejlhåndtering: undgå blanke sider, uklare beskeder og tabt arbejde

En app er ikke driftsklar, hvis en netværksfejl, afvist handling eller kodefejl efterlader brugeren med en tom side og tvivl om, hvorvidt arbejdet blev gemt. God fejlhåndtering gør udfaldet tydeligt, begrænser skaden og giver både bruger og support en sikker vej videre.

Skeln mellem fejl, som kræver forskellige svar

“Noget gik galt” kan dække over meget forskellige situationer. Beskriv de fejl, som kan opstå i appens vigtigste forløb, og aftal hvad brugeren, appen og driften skal gøre ved hver type. Teknologien afgør implementeringen; adfærden skal følge konsekvensen.

SituationSvar til brugerenDriftsadfærd
Felt eller valg er ugyldigtVis præcis hvad der skal rettes, og bevar restenNormal afvisning, normalt ingen alarm
Brugeren mangler adgangAfvis handlingen uden at afsløre andres dataLog relevante gentagelser eller mistænkelige mønstre
Netværk eller tjeneste er midlertidigt vækFortæl hvad der ikke blev færdigt, og om det kan prøves igenBegræns automatiske forsøg og overvåg gentagne fejl
Uventet kode- eller serverfejlVis en sikker fallback og et sporings-idGem tekniske detaljer i beskyttede logs og alarmér efter alvor
Resultatet er ukendt efter timeoutSig at status er ukendt; lov ikke at handlingen fejledeAfstem resultatet før en skrivning eventuelt gentages

En fejlbesked skal besvare tre spørgsmål

En brugbar besked fortæller hvad der skete, hvad der skete med brugerens handling, og hvad personen kan gøre nu. Teksten skal være konkret uden at vise stack traces, databaseforespørgsler, filstier, interne værtsnavne, tokens eller andre tekniske detaljer.

Hvad skete der?
“Fakturaen kunne ikke oprettes” er bedre end “Fejl 500”.
Blev noget gemt?
Sig tydeligt “Ændringen er ikke gemt” eller “Vi kontrollerer stadig resultatet”.
Hvad kan jeg gøre?
Ret et felt, prøv igen, genindlæs en afgrænset del eller kontakt support med reference.
Vis ikke den rå serverfejl. OWASP anbefaler en generisk, sikker respons ved uventede fejl og tekniske detaljer i serverens beskyttede log. Kendte forretningsfejl må gerne være konkrete, når teksten ikke røber følsomme data.

Giv API-fejl en fast kontrakt

Frontend og backend skal være enige om mere end et frit tekstfelt. Brug korrekt HTTP-status og stabile fejlkoder, som brugerfladen kan reagere på. RFC 9457 beskriver formatet “Problem Details” til maskinlæsbare API-fejl, men appen kan også have en anden veldokumenteret kontrakt, hvis den allerede fungerer.

  • Stabil type eller kode: Lad klienten reagere på eksempelvis booking_conflict i stedet for at fortolke dansk fritekst.
  • Korrekt status: Skeln mellem ugyldigt input, manglende login, manglende adgang, konflikt og en uventet serverfejl.
  • Sikker detalje: Hjælp klienten med at rette problemet; brug ikke API-svaret som et vindue til intern fejlsøgning.
  • Sporings-id: Returnér en ufølsom reference til den konkrete hændelse, som support kan finde i logs.
  • Feltniveau: Ved valideringsfejl kan et struktureret felt-id og en besked forbinde fejlen med det rigtige input.

Firebase callable functions har sin egen fejlmodel med kode, besked og valgfri detaljer. Et andet framework eller en anden cloud kan have en anden standard. Brug den officielle model i den stack, appen allerede har, og oversæt den til en ensartet brugeroplevelse.

Bevar brugerens arbejde, før I tilbyder “Prøv igen”

Et nyt forsøg er kun sikkert, hvis appen ved, hvad der allerede er sket. Ved en ren læsehandling kan genindlæsning ofte være ufarlig. Ved oprettelse af ordre, booking, betaling eller mail kan et blindt nyt forsøg skabe dubletter eller gentage en handling.

  • Bevar input: Lad ikke en midlertidig fejl rydde en lang formular eller et kladdearbejde.
  • Deaktivér ikke for evigt: En knap må ikke sidde fast i “Gemmer”, når requestet fejler eller får timeout.
  • Skeln mellem afvist og ukendt: En timeout beviser ikke, at serveren ikke gennemførte handlingen.
  • Afstem kritiske skrivninger: Slå resultatet op med en stabil reference, før brugeren eller appen sender igen.
  • Brug idempotens, hvor gentagelse er nødvendig: Samme logiske handling skal ikke oprette to ordrer eller betalinger.

Den konkrete retry- og idempotensmodel er beskrevet i guiden omstabile eksterne API-kald. Her er pointen, at fejlbeskeden og brugerens handling skal stemme med den virkelige status.

Lad én fejl ramme mindst muligt af appen

En fejl i et dashboardkort bør ikke nødvendigvis fjerne navigationen, en åben kladde og resten af siden. Placér fallback-visninger omkring meningsfulde dele af løsningen, så brugeren kan forstå påvirkningen og fortsætte, hvor det er sikkert.

React og andre frontend-frameworks

React Error Boundaries kan vise fallback-indhold ved fejl under rendering i et underliggende komponenttræ. React dokumenterer samtidig, at de ikke fanger alle fejltyper, blandt andet almindelige event handlers og vilkårlig asynkron kode. Netværkskald, submit-handlinger og baggrundsarbejde kræver derfor deres egen håndtering.

Server, funktioner og jobs

Brug et centralt fejllag til ukendte exceptions, men fang kendte forretningsfejl tæt på handlingen. Et baggrundsjob skal ende i en synlig fejlstatus eller en kontrolleret fejlkø – ikke forsvinde efter at browseren har vist “modtaget”.

Forbind brugerens reference med driften

Et sporings-id er nyttigt, når det samme id følger requestet gennem API, funktion, databasekald og relevante logs. Det skal være en ny, ufølsom reference – ikke et adgangstoken, et fuldt bruger-id eller en værdi, som giver adgang til andre hændelser.

  • Brugeren ser: en rolig besked, handlingens status, et muligt næste skridt og reference ved behov.
  • Support ser: tidspunkt, version, berørt funktion, sporings-id og den relevante tekniske fejl i beskyttede systemer.
  • Overvågningen ser: fejltype, frekvens, påvirkede forløb og om fejlen stiger efter en udgivelse.

Gem ikke hele formularer, tokens eller rå persondata “for en sikkerheds skyld”.Logningsguidendækker dataminimering, struktur, alarmer og ansvar.

Test fejlvejene som rigtige brugerforløb

En enhedstest af en fejlkode beviser ikke, at en medarbejder kan komme videre. Afprøv de kritiske fejlscenarier gennem brugerflade, API og driftsspor med kontrollerede testdata.

  1. Afvis input: Vis konkrete fejl ved de rigtige felter, og bevar alle gyldige værdier.
  2. Fjern netværket: Stop forbindelsen før og under en gemning, og kontrollér status, knapper og bevaret kladde.
  3. Returnér sikre 4xx- og 5xx-svar: Bekræft at frontend reagerer på koden uden at vise rå tekniske detaljer.
  4. Fremkald en renderingsfejl: Kontrollér at den relevante fallback vises, og at navigation eller andre uafhængige dele stadig virker.
  5. Giv timeout efter en skrivning: Bevis at appen afstemmer resultatet og ikke opretter en dublet ved nyt forsøg.
  6. Find hændelsen i drift: Brug reference-id'et til at finde den rigtige log uden at søge i persondata.

Fejl og status, som vises dynamisk uden sideskift, skal også kunne opfattes med hjælpemidler. W3C beskriver, hvordan synlige statusbeskeder kan markeres, så de annonceres uden at flytte fokus unødigt.

Typiske fejl i AI-byggede apps

  • Rå exception vises i browseren: Brugeren ser stack trace, SQL-detaljer, filstier eller interne navne.
  • Alt bliver “Noget gik galt”: Kendte fejl som ugyldigt input og manglende adgang kan ikke rettes eller skelnes.
  • HTTP 200 bruges til alle svar: Klient, overvågning og cache kan ikke se, at handlingen faktisk fejlede.
  • Teksten bruges som fejlkode: En lille sproglig ændring bryder frontendens logik.
  • Hele siden forsvinder: En lokal komponentfejl gør også navigation og ufærdigt arbejde utilgængeligt.
  • “Prøv igen” gentager en skrivning: Timeout efter en gennemført handling skaber dubletordre eller dobbeltsend.
  • Fejlen logges uden sammenhæng: Support kan ikke forbinde brugerens tidspunkt og reference med den tekniske hændelse.
  • Kun succesvejen testes: Knapper bliver hængende, input ryddes, eller fejlbeskeden kan ikke opdages med tastatur og skærmlæser.

Tjekliste før medarbejdere eller kunder bruger appen

  • ☐ Kritiske brugerforløb har navngivne fejlscenarier og aftalt adfærd.
  • ☐ Kendte validerings-, adgangs- og konfliktfejl er adskilt fra uventede systemfejl.
  • ☐ Fejlbeskeden fortæller hvad der skete, om handlingen blev gemt, og hvad brugeren kan gøre.
  • ☐ Stack traces, databasefejl, interne værtsnavne, tokens og følsomme data vises ikke til brugeren.
  • ☐ API-fejl bruger korrekt status, stabile koder og et dokumenteret format.
  • ☐ Uventede fejl får en ufølsom reference, der kan findes i beskyttede logs.
  • ☐ Formularinput og kladder bevares, når det kan gøres sikkert.
  • ☐ Nyt forsøg tilbydes kun, når handlingen kan gentages uden ukendt resultat eller dubletter.
  • ☐ En lokal frontendfejl kan vises som fallback uden at fjerne unødigt meget af appen.
  • ☐ Netværksfejl, 4xx, 5xx, timeout, renderingsfejl og ukendt resultat er afprøvet.
  • ☐ Dynamiske fejl og statusbeskeder er synlige, forståelige og tilgængelige for hjælpemidler.
  • ☐ Gentagne eller alvorlige fejl bliver målt og når en navngiven driftsansvarlig.

Relaterede guides

Officielle kilder

Fejlmekanismer varierer mellem frameworks, API'er og cloudplatforme. Brug de teknologiuafhængige principper til at definere adfærden, og følg derefter den officielle dokumentation for den stack, appen faktisk bruger.

Virker appen, men bliver fejl stadig håndteret med genindlæsning og håb?

Startklar er til virksomheder med en fungerende AI-bygget app, som skal kunne bruges trygt af medarbejdere eller kunder. Her kan fejlveje, brugerfeedback, API-kontrakter, sporbarhed og tests blive gennemgået i den stack, appen faktisk bruger.

Se Startklar-forløbet