<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BEKK Open &#187; feilhåndtering</title>
	<atom:link href="http://open.bekk.no/tag/feilhandtering/feed/" rel="self" type="application/rss+xml" />
	<link>http://open.bekk.no</link>
	<description>Et innblikk i hva som skjer i BEKK</description>
	<lastBuildDate>Fri, 11 May 2012 16:31:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Slipp utvikleren til!</title>
		<link>http://open.bekk.no/slipp-utvikleren-til/</link>
		<comments>http://open.bekk.no/slipp-utvikleren-til/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 20:38:33 +0000</pubDate>
		<dc:creator>Torstein Gjengedal</dc:creator>
				<category><![CDATA[IT-rådgivning]]></category>
		<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[Systemarkitektur]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[driftbarhet]]></category>
		<category><![CDATA[feilhåndtering]]></category>
		<category><![CDATA[it-strategi]]></category>
		<category><![CDATA[kvalitet]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=6534</guid>
		<description><![CDATA[Jeg leste nettopp boken 97 Things Every Programmer Should Know. Dette er en bok satt sammen av Kevlin Henney med utspring i en egen wiki. De 97 kapitlene er skrevet av ulike forfattere, der hvert kapittel omfatter et tema, prinsipp eller tips som programmerere bør kjenne til eller benytte. Noen av påstandene i ett av [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg leste nettopp boken <em><a href="http://shop.oreilly.com/product/9780596809492.do#" target="_blank">97 Things Every Programmer Should Know</a></em>. Dette er en bok satt sammen av Kevlin Henney med utspring i en egen <a href="http://programmer.97things.oreilly.com/">wiki</a>. De 97 kapitlene er skrevet av ulike forfattere, der hvert kapittel omfatter et tema, prinsipp eller tips som programmerere bør kjenne til eller benytte. Noen av påstandene i ett av kapitlene strider imidlertid imot mine egne erfaringer.</p>
<p>I <a href="http://programmer.97things.oreilly.com/wiki/index.php/Don%27t_Touch_that_Code%21" target="_blank">kapittel 31 &#8211; <em>Don´t Touch That Code</em></a>, hevder forfatteren at utviklere ikke skal fikse feil i produksjon, og at dette bør forhindres ved at utviklere ikke gis tilgang til noe annet enn utviklingsmiljøet. Nærmere bestemt:</p>
<blockquote><p>&#8230; a developer &#8212; even a senior developer &#8212; should never have access beyond the development server</p></blockquote>
<p>og</p>
<blockquote><p>Under no circumstances &#8212; ever, at all &#8212; should a developer have access to a production server.</p></blockquote>
<p>Det er fornuftig at feilretting ikke bør skje direkte i produksjonsmiljøet. Selv har jeg imidlertid aldri opplevd dette, og har ikke intrykk av at dette utgjør et stort problem i de fleste utviklingsprosjekter. Derimot har man mange andre utfordringer, og en del av disse kan løses bedre nettopp ved å la utviklerne ha tilgang.</p>
<h4>Feilanalyse</h4>
<p>Ved daglig drift kan det oppstå feil eller andre hendelser som man har lyst til å se nærmere på. I slike tilfeller er det viktig å ha gode logger og at utviklerne har rask og enkel tilgang til disse. Dette er enklest å oppnå ved at utviklerne har direkte lesetilgang til loggene. Dersom man har en politikk som ikke tillater dette, ender man gjerne med lange og tidkrevende epostvekslinger mellom utviklings- og driftspersonell for å få tak i loggene det gjelder, noe som er tungvint og irriterende for alle parter &#8211; spesielt dersom det er snakk om kritiske feil der tidsfaktoren er viktig.</p>
<h4>Monitorering</h4>
<p>Loggene kan også benyttes til å gjenskape feilsituasjoner og/eller monitorere feilsituasjoner &#8220;live&#8221;, noe som kan være en svært effektiv og nyttig fremgangsmåte i gitte situasjoner. Slik oppfølging blir ofte enklere og mer fleksibelt dersom man har bygget applikasjonen slik at logginnstillinger og eventuelle andre parametre kan justeres mens applikasjonen kjører. Slik monitorering og justering er det utviklerne, som kjenner applikasjonen som sin egen bukselomme, som bør gjøre. Hvis utviklerne ikke har live tilgang til miljøet, nekter man seg i praksis et viktig verktøy ved feilsituasjoner.</p>
<h4>Administrasjon og støtteverktøy</h4>
<p>Ofte kan støttefunksjoner til en applikasjon være nyttige, enten det er operasjoner som er del av daglig drift eller ad-hoc-funksjoner som kan være nyttige ved spesielle situasjoner. Eksempler på dette kan være automatisk monitorering og varsling basert på logg-data eller interaksjon med applikasjonen som f.eks. invalidering av cache eller av-/påslåing av funksjoner på gitte tidspunkt. Mange slike støttefunksjoner kan utføres ved enkle kommandolinjescript. Igjen er det ofte utviklere som er best egnet til å lage slike støttefunksjoner, spesielt av ad-hoc-art, da det er de som best vet hvikle muligheter man har i applikasjonen.</p>
<h4>Utrulling</h4>
<p>Applikasjonsutrulling er også et område der utviklere kan spille en viktig rolle. Utviklere gjør gjerne utrulling på lokal maskin flere ganger daglig, og kjenner dermed denne fasen bedre enn noen. De er også ofte de som er best skikket til å forenkle, forbedre og automatisere denne prosessen.</p>
<p>&nbsp;</p>
<p>Å arbeide for å forbedre kommunikasjon, samarbeid og forståelse mellom utviklings- og driftsorganisasjonene kan være veldig nyttig og givende i mange prosjekter. Nærhet og samarbeid mellom utvikling og drift kan ofte være av avgjørende betydning for smidighet både ved utrulling av applikasjoner og ved oppfølging og overvåkning av daglig drift. DevOps er et uttrykk som er mye i vinden om dagen, og som fokuserer på nettopp dette. Artikkelen <em><a href="http://www.readwriteweb.com/enterprise/2011/08/devops-what-it-is-why-it-exist.php" target="_blank">DevOps: What It Is, Why It Exists and Why It&#8217;s Indispensable</a></em> gir en fin introduksjon til DevOps.</p>
<p>Utviklere bør altså ikke gjøre bugfixer i form av kodeendringer, omkonfigurering av programvare eller denslags direkte i produksjon. Dersom dette er et problem, bør det kunne forhindres &#8212; for eksempel ved noe så enkelt som rettighetsinnstilling på brukerne. Det er naturligvis ikke slik at utviklerne fullstendig skal ta over produksjonsmiljøet, men man gjør seg selv en bjørnetjeneste dersom man ikke benytter seg av den applikasjonsspesifikke ekspertisen utviklerne bestitter &#8212; også ved kjøretid i produksjon.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/slipp-utvikleren-til/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Kjør automatisk miljøverifikasjon!</title>
		<link>http://open.bekk.no/kjor-automatisk-miljoverifikasjon/</link>
		<comments>http://open.bekk.no/kjor-automatisk-miljoverifikasjon/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 06:59:59 +0000</pubDate>
		<dc:creator>Bent Kristiansen</dc:creator>
				<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[automatisk miljøverifikasjon]]></category>
		<category><![CDATA[driftbarhet]]></category>
		<category><![CDATA[feilhåndtering]]></category>
		<category><![CDATA[installasjon]]></category>
		<category><![CDATA[kvalitet]]></category>
		<category><![CDATA[miljøverifikasjon]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=5455</guid>
		<description><![CDATA[Vi som jobber med utvikling og forvaltning av IT-systemer, har ofte behov for å kontrollere om et miljø er i orden. Dette gjøres i mange tilfeller manuelt. Denne bloggposten er tenkt som inspirasjon for komme igang med automatisk miljøverifikasjon - noe som garantert vil være kvalitetsfremmende og tidsbesparende. Identifiser situasjoner hvor manuell verifikasjon gjøres i dag Vi [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Vi som jobber med utvikling og forvaltning av IT-systemer, har ofte behov for å kontrollere om et miljø er i orden. Dette gjøres i mange tilfeller manuelt. Denne bloggposten er tenkt som inspirasjon for komme igang med automatisk miljøverifikasjon - noe som garantert vil være kvalitetsfremmende og tidsbesparende.</strong></p>
<p/>
<h2>Identifiser situasjoner hvor manuell verifikasjon gjøres i dag</h2>
<p>Vi ønsker eksempelvis å vite om eksterne og interne avhengigheter er på plass, og at det ikke har oppstått åpenbare systemfeil når utvikler setter opp et utviklingsmiljø, ny kode distribueres til et test eller produksjonsmiljø, eller når forvalting kontaktes i forbindelse med systemfeil. Disse tre situasjonene forklares mer deltajert nedenfor.<br />
<strong>Oppsett av utviklingsmiljø</strong><br />
Når utviklere setter opp hvert sitt utviklingsmiljø verifiseres det at oppsettet er i orden ved å:</p>
<ul>
<li>Kjøre enhetstester, integrasjonstester og akseptansetester</li>
<li>Manuelt teste hovedfunksjoner i en eller flere applikasjoner/nettsider</li>
</ul>
<p><strong>Distribusjon av kode til test eller produksjonsmiljø</strong><br />
Når ny kode er distribuert til et miljø, gjør man vanligvis verifisering ved å:</p>
<ul>
<li>Manuelt teste hovedfunksjoner i en eller flere applikasjoner/nettsider</li>
<li>Manuelt teste ny funksjonalitet</li>
</ul>
<p><strong>Forvaltning</strong><br />
Når det kommer henvendelser om systemfeil til brukerstøtte eller driftsansvarlige, gjøres ofte feilsøking ved å:</p>
<ul>
<li>Manuelt teste en eller flere funkjsoner i systemet</li>
<li>Kontrollere systemloggen</li>
</ul>
<p>Manuell verifikasjon i situasjonene beskrevet ovenfor er tidkrevende og kan være vanskelige å utføre.</p>
<h2>Hvordan gjøre automatisk miljøverifikasjon?</h2>
<p><a href="http://open.bekk.no/wp-content/uploads/2011/06/mv_sample_fig1.png"><img title="Automatisk miljøverifikasjon" src="http://open.bekk.no/wp-content/uploads/2011/06/mv_sample_fig1.png" alt="Eksempel på visualisert automatisk miljøverifikasjon" width="530" height="435" /></a></p>
<p>I BEKK har vi god erfaring med å lage skript, nettside og/eller applikasjon som sjekker avhengigheter og funksjoner i et IT-system.</p>
<h3>Skript</h3>
<p>For å verifisere et miljø i forbindelse med oppsett eller installasjon kan det være bra å lage et skript som returnerer resultat fra verifiseringen uten å vise det visuelt. Skriptet startes helt til slutt etter bygg og deploy er utført. Dersom noe i miljøverifiseringsskriptet feiler, returneres en feilkode, og mer detaljert feilmelding logges. Skriptet bør lese konfigurasjonsfiler til tjenester og konfigurasjonsfil for eventuelle klienter som distribueres, etter distribusjon. Da får vi kontrollert at det ikke er feil i kode som bygger konfigurasjonen under distribusjon til de forskjellige miljøene.</p>
<h3>Nettside</h3>
<p>Skal man verifisere et kjørende miljø for en internett- eller intranettløsning er det bra å ha en side som kjører forskjellige tester i løsningen, og som viser resultatet visuelt. Adressen til siden gir man til interesserte som har behov for den, som: testteamet, systemadministrator, superbrukere, support og drift. Siden bør tilgangsstyres.</p>
<h3>Applikasjon</h3>
<p>Hvis systemet har distribuerte klienter anbefaler vi at det distribueres en egen applikasjon for diagnose, eller at det settes opp et menyvalg under hjelp-menyen som starter systemdiagnosen (dersom man har autorisasjon).</p>
<p>Det er essensielt at innstillinger og endepunkter leses fra klientens konfigurasjon. Diagnose-applikasjonen bør kjøre i samme brukerkontekst som den distribuerte klienten.</p>
<h2>Hva kan/bør verifiseres på denne måten?</h2>
<p>Egentlig er det ingen grenser for hva man kan verifisere på denne måten, men ikke gjør det for avansert. Da blir det vanskelig å vedlikeholde. Miljøverifikasjon skal ikke erstatte systemintegrasjonstester eller akseptansetester.</p>
<p>Verifisering av tjeneste-endepunkt til eksterne og interne tjenester, databasetilkoblingsstrenger og noen basis-operasjoner er tilstrekkelig, og svært nyttig etter vår erfaring.</p>
<p>Noen regler:</p>
<ul>
<li>Miljøverifikasjon bør gjøres så enkelt som mulig</li>
<li>Miljøverifikasjon bør ikke ta lang tid å kjøre (&lt;1 min)</li>
<li>Vurder å benytte tråder (for å få raskere total responstid)</li>
</ul>
<p>Start med å få på plass sjekk om én tjeneste svarer, for å komme i gang. Legg til mer etterhvert. Det kan være en god idé å inkludere løsning på kjente feilsituasjoner, slik at feilsøking går fortere.</p>
<h2>Hva er dine erfaringer?</h2>
<p>Hva er dine erfaringer med verifisering og feilsøking i forbindelse med oppsett og distribusjon av kildekode til ulike miljøer?</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/kjor-automatisk-miljoverifikasjon/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Riktig feilhåndtering: Kontekstinformasjon</title>
		<link>http://open.bekk.no/riktig-feilhandtering-kontekstinformasjon/</link>
		<comments>http://open.bekk.no/riktig-feilhandtering-kontekstinformasjon/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 07:17:10 +0000</pubDate>
		<dc:creator>Trond Arve Wasskog</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[driftbarhet]]></category>
		<category><![CDATA[feilhåndtering]]></category>
		<category><![CDATA[kvalitet]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=1687</guid>
		<description><![CDATA[For å feilsøke og finne årsaken til en feil har man behov for informasjon om kontekst når situasjonen inntraff. Dette inkluderer overordnet informasjon som maskin, bruker, tidspunkt og opprinnelse i koden. I tillegg vil man gjerne ha spesifikk informasjon om tilstand og data som ble behandlet. Målet er å kunne gjenskape situasjonen i et utviklingsmiljø for å forstå og rette feilen.]]></description>
			<content:encoded><![CDATA[<p>For å feilsøke og finne årsaken til en feil har man behov for informasjon om kontekst når situasjonen inntraff. Dette inkluderer overordnet informasjon som maskin, bruker, tidspunkt og opprinnelse i koden. I tillegg vil man gjerne ha spesifikk informasjon om tilstand og data som ble behandlet. Målet er å kunne gjenskape situasjonen i et utviklingsmiljø for å forstå og rette feilen.</p>
<p><strong>Standard informasjon</strong></p>
<p>Standard logginformasjon inkluderer typisk tidspunkt, alvorlighetsgrad, program- og komponentnavn i tillegg til selve meldingen. Et godt loggrammeverk tilbyr tilpasning av både innhold og format av disse parametrene.</p>
<p>Riktig feilhåndtering forutsetter fornuftig <a title="Feilkategoriseing og -hendelse" href="http://open.bekk.no/2009/11/18/riktig-feilhandtering-feilkategori-og-hendelse/">kategorisering og identifisering av feilhendelse.</a> Feilkategori og unik feil-ID er en viktig del av kontekstinformasjonen.</p>
<p><strong>Brukernavn</strong></p>
<p>Brukernavn for den innloggede brukeren kan med fordel logges. Enkelte applikasjonsservere tilbyr denne funksjonaliteten forutsatt at du benytter de innebygde mekanismene for autentisering og logging. En teknikk man kan benytte i egen kode er å ha brukernavnet på trådkonteksten (for eksempel  en <a title="Java ThreadLocal" href="http://java.sun.com/javase/6/docs/api/java/lang/ThreadLocal.html">ThreadLocal</a> variabel i Java). Når en feil oppstår henter loggmekanismen brukernavnet fra trådkonteksten og skriver det til loggen. Mange sikkerhetsrammeverk bruker også denne teknikken, det kan derfor hende at brukernavnet allerede ligger klart for bruk.</p>
<p><strong>Støtte for vilkårlig kontekstinformasjon</strong></p>
<p>Når en feil oppstår er det gjerne nyttig å legge til spesifikk informasjon om tilstand og kontekst. Det kan også være behov for å supplere mer informasjon oppover i kall-stacken. Rammeverket bør derfor ha støtte for å legge til vilkårlig kontekstinformasjon, for eksempel som skissert under.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AbstractException<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   ...
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> leggTilFeilinformasjon<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> navn, <span style="color: #003399;">Object</span> info<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      feilinformasjon.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>navn, info<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>Selvbeskrivende objekter</strong></p>
<p>Når man skal logge tilstand for de ulike objektene er det en stor fordel at disse kan beskrive seg selv. Det er feil ansvarsfordeling dersom en feilhåndteringsrutine må pakke ut og formattere kontekstinformasjonen som skal logges. En slik tilnærming vil også sannsynligvis føre til inkonsistens og duplisering.</p>
<p>Java-mekanismen for selvbeskrivende objekter er den velkjente <a href="http://www.j2ee.me/javase/6/docs/api/java/lang/Object.html#toString%28%29">toString()-metoden</a>. Ved å implementere toString() på en god måte vil tilstand kunne logges enkelt og konsistent. I tillegg er det enkelt å lage automatiserte tester for denne funksjonaliteten, og disse kan også fungere som dokumentasjon. Komponenter som <a href="http://commons.apache.org/lang/api/org/apache/commons/lang/builder/ToStringBuilder.html">Apache ToStringBuilder</a> kan være nyttig for implementasjon av toString().</p>
<p><strong>Stacktrace og uventede feil<br />
</strong></p>
<p>God feilhåndtering<a href="http://open.bekk.no/2009/11/02/riktig-feilhandtering-det-finnes-bare-tre-feiltyper/"> betyr få stacktrace i loggen</a>. Ideelt sett oppstår behovet for stacktrace kun ved programmeringsfeil; gitt at applikasjonsfeil og systemfeil er riktig håndtert og har tilstrekkelig kontekstinformasjon. Imidlertid, når en uventet feil først oppstår er stacktracen en uvurderlig del av kontekstinformasjonen. Man kan med forlel skille ut disse i en egen logg for utviklere; drift ser ofte på stacktrace som et verdiløst irritasjonsmoment.</p>
<p><strong>Oppsummering</strong></p>
<p>God kontekstinformasjon er en sentral mekanisme for riktig feilhåndtering. Drift og utvikling kan med stor sannsynlighet forstå og gjenskape feilsituasjonen, og dermed også rette feilen raskt. Teknikkene for kontekstinformasjon er enkle å implementere, forutsatt at feilhåndtering er en prioritert og forstått del av prosjektet.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/riktig-feilhandtering-kontekstinformasjon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Riktig feilhåndtering: Hvem bryr seg?</title>
		<link>http://open.bekk.no/riktig-feilhandtering-hvem-bryr-seg/</link>
		<comments>http://open.bekk.no/riktig-feilhandtering-hvem-bryr-seg/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 19:23:58 +0000</pubDate>
		<dc:creator>Trond Arve Wasskog</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[driftbarhet]]></category>
		<category><![CDATA[feilhåndtering]]></category>
		<category><![CDATA[kvalitet]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=1662</guid>
		<description><![CDATA[For bedre feilhåndtering må man i større grad skille mellom ulike brukergrupper og deres behov.]]></description>
			<content:encoded><![CDATA[<p>Å kjenne brukerne og deres behov er sentralt i all utvikling. Dette gjelder også feilhåndtering. Her er en oversikt over typiske brukergrupper og deres behov:<em> </em></p>
<p><strong>Brukeren</strong></p>
<p>Brukeren av systemet er først og fremst opptatt av <em>at </em>en feil har oppstått, at situasjonen er håndtert og ikke medfører senere problemer. Det er selvfølgelig irriterende og kan være problematisk når feil inntreffer, uansett er det kritisk at situasjonen ser ut til å være under kontroll. Brukeren bryr seg sjelden om årsaken til feilen, men vil gjerne kunne identifisere den spesifikke situasjonen når hun snakker med supportapparatet.</p>
<p><strong>Forretningssiden</strong></p>
<p>Forretningssiden (funksjonelt ansvarlige i utviklingsprosessen) forstår primært funksjonelle feil, og antar ofte at utviklere og leverandører tar seg av andre feiltyper. De ønsker generelt en applikasjon uten kritiske feil, men vil sjelden sørge for at feilhåndtering blir riktig prioritert i utviklingsprosessen.</p>
<p><strong>Kunde/Bestiller</strong></p>
<p>Den som sitter på budsjettet og bestiller applikasjonen har forventninger om en fungerende applikasjon, men har vent seg til at ingen applikasjoner er feilfrie. De er vanligvis ikke tilstrekkelig involvert i prosjektet til å påvirke og vektlegge feilhåndtering. Noen stiller imidlertid med testledere som kan være erfarne nok til å ivareta dette ansvaret og sørge for at unntaks- og feilsituasjoner blir testet.</p>
<p><strong>Drift</strong></p>
<p>Drift vil vite <em>hva de skal gjøre når feil oppstår</em>. På kort sikt er drift kun interessert i å gjøre grep slik at systemet kjører videre og ikke har havnet i en ugyldig tilstand. Selv om årsaken til feilen kan være interessant vil driftpersoner sjelden ha behov for detaljerte beskrivelser. Imidlertid vil de gjerne ha en oversikt over potensielle og kjente feilsituasjoner, kunne gjenkjenne feilkategoriene og kanskje bygge opp en erfaringsbase  over tid.</p>
<p><strong>Utviklere</strong></p>
<p>Utviklere vil vite <em>alt</em>:</p>
<ul>
<li>Hva var årsaken til feilen?</li>
<li>På hvilken server skjedde den?</li>
<li>Når oppsto situasjonen?</li>
<li>Hvilken tilstand hadde brukeren og applikasjonen?</li>
<li>Hva var kontekst i feilsituasjonen?</li>
<li>Kan den gjenskapes?</li>
</ul>
<p>Ettersom utviklere ofte står for feilhåndteringen vil utviklerbehovene prege implementasjonen. Dette resulterer gjerne i detaljerte feilmeldinger i alle sammenhenger; i brukergrensesnittet, loggfiler og konsoller.</p>
<p><strong>Tilpasning til brukernes behov</strong></p>
<p>For bedre feilhåndtering må man i større grad skille mellom ulike brukergrupper og deres behov. Her er noen mulige tilnærminger:</p>
<ul>
<li>Utviklingsprosjektet må ta hovedansvaret for feilhåndteringen. All erfaring tilsier at man ikke kan forvente at forretningssiden eller bestiller vil sørge for at behovene beskrives og prioriteres. Dersom kunden ikke har en erfaren testleder bør prosjektene selv bekle denne rollen.</li>
<li>Unngå detaljerte feilbeskrivelser i brukergrensesnittet, men oppgi gjerne en unik feil-ID slik at det er mulig å finne tilbake til den spesifikke feilen.</li>
<li>Involver drift i hele utviklingsprosjektet slik at de kan bidra til kravstilling og kommunisere sine behov på lik linje med funksjonelle krav.</li>
<li>Sørg for konsistent feilkategorisering som drift kan bruke for å kjenne igjen feil.</li>
<li>Bruk gjerne forskjellige logger for drift og feilretting. Drift har i utgangspunktet ikke behov for de detaljerte feilbeskrivelsene som man har i forvaltning.</li>
<li>Sørg for å legge til kontekstinformasjon i feilsituasjoner.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/riktig-feilhandtering-hvem-bryr-seg/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Riktig feilhåndtering: Feilkategori og -hendelse</title>
		<link>http://open.bekk.no/riktig-feilhandtering-feilkategori-og-hendelse/</link>
		<comments>http://open.bekk.no/riktig-feilhandtering-feilkategori-og-hendelse/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 08:19:14 +0000</pubDate>
		<dc:creator>Trond Arve Wasskog</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[driftbarhet]]></category>
		<category><![CDATA[feilhåndtering]]></category>
		<category><![CDATA[kvalitet]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=1560</guid>
		<description><![CDATA[Når man feilsøker kan man skille mellom feilkategori og feilhendelse. Kategorien beskriver hvilken feiltype som har oppstått, mens identifisering av feilhendelsen forteller hva som har skjedd til en bestemt tid i en spesifikk sammenheng.]]></description>
			<content:encoded><![CDATA[<p><strong>Feilkategori vs. -hendelse</strong></p>
<p>Når man feilsøker kan man skille mellom to ulike behov:</p>
<ul>
<li><em>Feilkategori</em> beskriver hvilken feil som har oppstått. Den kategoriserer hendelser av samme type, og brukes for å forstå hva som har skjedd.</li>
<li>Identifisering av <em>feilhendelsen</em> forteller hva som har skjedd til en bestemt tid i en spesifikk sammenheng. Typisk er dette nyttig for å finne ut hva som har skjedd når man feilsøker en bestemt feilsituasjon meldt av en bruker.</li>
</ul>
<p><strong>Feilkategorisering</strong></p>
<p>Feilkategorisering har flere alternative tilnærminger:</p>
<ul>
<li>Hver feilkategori representeres med en egen Exception. <a title="java.lang.Exception" href="http://java.sun.com/javase/6/docs/api/java/lang/Exception.html" target="_blank">Java SE APIet</a> er et eksempel på denne tilnærmingen. Dette resulterer typisk i mange Exception-klasser  definert på ulike steder i pakkestrukturen. Tilnærmingen kan derfor kalles <em>distribuert</em>.</li>
<li>Et fåtall sentrale Exception-klasser definerer feiltypene (gjerne <a title="Tre feiltyper" href="http://open.bekk.no/2009/11/02/riktig-feilhandtering-det-finnes-bare-tre-feiltyper/">Applikasjonsfeil, Systemfeil og Programmeringsfeil</a>). For hver feiltype defineres en ID som feiltypen bærer med seg (typisk en Enum spesifisert i constructor). Denne tilnærmingen kan ses på som <em>sentralisert</em>.</li>
<li>Kombinasjoner av disse, for eksempel et fåtall sentrale Exception-klasser med distribuerte subklasser.</li>
</ul>
<div style="text-align: center;"><img style="border: 1px solid black;" title="Sentralisert feilhierarki" src="http://open.bekk.no/wp-content/uploads/2009/11/SentralisertFeilhierarki.png" alt="Sentralisert feilhierarki" /><br />
<em>Sentralisert feilhierarki</em></div>
<p>Uavhengig av tilnærming er hensikten å gjenkjenne feilen og forstå hvorfor den oppstår. En driftsperson vil kanskje lage en erfaringsbase for kjente feilkategorier. En utvikler som skal feilrette har også god nytte av god feilkategorisering for å finne årsaken.</p>
<p>Min erfaring er at applikasjoner lykkes best med en sentralisert tilnærming, der man definerer feilkategoriene som en felles Enum. Rammeverk (f.eks. Java SE API og Spring Framework) velger gjerne en distribuert tilnærming; ettersom dette ikke er applikasjoner har man ikke det samme behovet for sentral oversikt over feilkategoriene.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">Enum</span> Kategori <span style="color: #009900;">&#123;</span> INGEN_PENGER, FEIL_ROLLE, UTESTENGT <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
...
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AbstractException<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">public</span> AbstractException<span style="color: #009900;">&#40;</span>Kategori kategori, ...<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      ...
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: center;"><em>Kategorisereing av feil ved hjelp av Enum</em></p>
<p><strong>Identifisering av feilhendelse</strong></p>
<p>For å finne ut av en spesifikk feil ønsker man å identifisere den unike hendelsen som forårsaket feilen. Typisk er dette en situasjon der en bruker melder en feil eller når man feilsøker en hendelse som andre har rapportert tidligere. Å kunne identifisere denne ene feilen i en stor loggfil er gull verdt. Dette krever at hver enkelt feil blir logget med en unik ID.</p>
<p>En teknikk som fungerer bra nok i de fleste sammenhenger er å bruke tidspunktet feilen oppstår (i millisekunder) som ID. Denne IDen vises i feilsammenheng og skrives samtidig til feilloggen. Sannsynligheten for at to eller flere feil oppstår i samme millisekund er tilstede, men denne teknikken vil uansett begrense utvalget til et minimum. Funksjonaliteten for å lagre IDen implementeres i Exception-superklassen.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AbstractException<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> uid<span style="color: #339933;">;</span>
   <span style="color: #000000; font-weight: bold;">public</span> AbstractException<span style="color: #009900;">&#40;</span>...<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      uid <span style="color: #339933;">=</span> <span style="color: #003399;">System</span>.<span style="color: #006633;">currentTimeMillis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// skrives til loggen</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: center;"><em>Eksempel på identifisering av Exception-instans med timestamp.</em></p>
<p><strong>Oppsummering</strong></p>
<p>God feilhåndtering forutsetter riktig kategorisering av feil i tillegg til støtte for å identifisere hver enkelt feilhendelse. Som alltid krever dette at man har et bevisst og målrettet forhold til feilhåndtering gjennom hele prosjektløpet. Det er fullt mulig å unngå at feilkategorisering og idendifisering av feilhendelse blir klattet på mot slutten av et prosjekt; å involvere driftpersoner som kravstillere på lik linje med annen funksjonalitet er en god start. God kontekstinformasjon i en feilsituasjon er også viktig, dette blir et eget tema i denne serien.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/riktig-feilhandtering-feilkategori-og-hendelse/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Riktig feilhåndtering: Det finnes bare tre feiltyper</title>
		<link>http://open.bekk.no/riktig-feilhandtering-det-finnes-bare-tre-feiltyper/</link>
		<comments>http://open.bekk.no/riktig-feilhandtering-det-finnes-bare-tre-feiltyper/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 19:24:47 +0000</pubDate>
		<dc:creator>Trond Arve Wasskog</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[driftbarhet]]></category>
		<category><![CDATA[feilhåndtering]]></category>
		<category><![CDATA[kvalitet]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=1484</guid>
		<description><![CDATA[Det finnes bare tre feiltyper: Applikasjonsfeil, Systemfeil og Programmeringsfeil. 
]]></description>
			<content:encoded><![CDATA[<p>I en applikasjon finnes det bare typer feil:</p>
<ul>
<li>Applikasjonsfeil</li>
<li>Systemfeil</li>
<li>Programmeringsfeil</li>
</ul>
<p>Applikasjonsfeil skyldes at funksjonelle forutsetninger ikke er tilfredsstilt. I praksis er dette gjerne ugyldig eller feilformatert input som for kort fødselsnummer, e-postadresse uten @, dobbeltføring av betaling eller en kunde som har utilstrekkelig bonusnivå for å utføre en handling. Applikasjonsfeil kan sies å være forventet og skal håndteres på lik linje med andre krav. Det kan være krevende å forutse alle slike feilsituasjoner. Erfaringsmessig har forretningsfolk god oversikt over de vanligste funksjonelle problemene, mens teknikere er flinke til å tenke på grenseverdier og inkonsistens. En iterativ tilnærming med teknikker som test-drevet utvikling, brukerhistorier og BDD vil avsløre de fleste applikasjonsfeilene. I utgangspunktet skal det ikke være nødvendig å feilrette og rulle ut en ny versjon av applikasjonen for denne typen feil. For å håndtere applikasjonsfeilene som allikevel slipper ut i produksjon er det viktig med hyppig utrulling slik at man kan fange opp disse etterhvert som man får praktisk erfaring med systemet.</p>
<p>Systemfeil skyldes feil i applikasjonens omgivelser eller infrastruktur. Typisk er dette en disk som går full, et nettverk som blir utilgjengelig eller en server blir overbelastet. Slike feil er også til en viss grad forventet; de opptrer sjelden, kan være vanskelig å forutse, men i praksis er det gjerne rimelig enkelt å teste slike feilsituasjoner. Ved systemfeil kan det gi mening å kjøre <em>fail-over</em> om mulig, alternativt vente en stund for deretter å prøve operasjonen på nytt; denne type feilhåndtering tilbys gjerne av meldingssystemer. Feilretting og ny utrulling skal ikke være nødvendig for denne feiltypen.</p>
<p>Programmeringsfeil skyldes at utviklere ikke har gjort jobben sin. De oppstår når applikasjonen ikke klarer å håndtere uventede hendelser på på robust vis. Typiske eksempler på dette (i en Java-applikasjon) er når systemet spyr ut feil av typen NullPointerException, NoSuchElementException og IndexOutOfBoundsException. Godt håndtverk med teknikker som TDD og automatisert testing, parprogrammering og kodegjennomgang er effektive tilnærminger for å minimere denne typen feil. Når en programmeringsfeil oppstår krever det en feilretting og påfølgende utrulling av ny versjon.</p>
<p>Tabellen under gir en oversikt over feiltypene og om de bør fanges og håndteres i applikasjonen, om det er mulig å vente litt og prøve operasjonen på nytt samt om den krever feilretting og utrulling av ny versjon:</p>
<table border="1" align="center">
<tbody>
<tr>
<th>Type</th>
<th>Fanges og håndteres?</th>
<th>Prøve på nytt?</th>
<th>Feilretting og utrulling?</th>
</tr>
<tr style="text-align: center;">
<td>Applikasjonsfeil</td>
<td>Ja/Mulig</td>
<td>Nei</td>
<td>Nei</td>
</tr>
<tr style="text-align: center;">
<td>Systemfeil</td>
<td>Nei/Mulig</td>
<td>Ja</td>
<td>Nei</td>
</tr>
<tr style="text-align: center;">
<td>Programmeringsfeil</td>
<td>Nei</td>
<td>Nei</td>
<td>Ja</td>
</tr>
</tbody>
</table>
<p>Dårlig feilhåndtering er dessverre alt for utbredt i vår industri. Antall stacktrace i loggen er en indikator på hvilken kvalitet applikasjonen har; applikasjonsfeil og systemfeil skal være håndtert mens programmeringsfeil skal være luket ut i utviklingsprosessen. Et bevisst forhold til feiltyper og hvordan de bør håndteres er et godt utgangspunkt for å lykkes på dette området. Riktig feilhåndtering krever imidlertid målrettet innsats gjennom hele utviklingsløpet.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/riktig-feilhandtering-det-finnes-bare-tre-feiltyper/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

