Dino skrev:
Alltså ett exception är något som applikationen skall hantera och för programmeraren att lösa. Besökaren skall aldrig ta del av dessa utan helt enkelt skickas till en felsida när ett sker.
Det där vet jag inte om jag håller med om. Det finns så många olika typer av exceptions och precis som Emission säger så är ett exception ett undantag och inte ett fel, det betyder att exceptions används när något oväntat inträffar.
Visst finns det "Exceptions" som är möjliga att hanterar i sin kod, och låta flödet gå vidare bara med annan inriktning. Sedan finns det Exceptions som gör att du måste avbryta ditt flöde och presentera en felsida för användaren. Sedan så har du extrema exceptions som gör att du inte kan göra något annat än stänga ner din applikation, dessa fel kan du inte hanterar själv, utan måste bara döda applikationen, eftersom felet ligger på ett djupare plan än din applikation, minnesproblem exempel.
Men senmoralen är att visa saker som man kan förvänta sig och kontrollera själv innan skall inte lösas med Exceptions av prestandaskäl, utan lösas så som både du och jag föreslagit, andra fel som du inte kan kontrollera själv, typ nätverket dog, detta är ett typiskt exempel på där du har 2 möjligheter, antingen så lägger du en try-catch runt din "nätverks-operation" och löser problemet själv om det uppstår (om du kan göra det), eller så låter du felet bubbla upp till Applikation_onHandlingError och fångar det där och presenterar ett fel för användaren att operationen inte kunde utföras för att nätverket är nere.
doggelito skrev:
Du säger "skulle gjort så här", hur gör du själv och även du Gladh, hur gör ni kortfattat när ni visar meddelanden till användaren?
Har ni en liknande uppbyggnad av klasser?
Nope, jag skapar 2 typer av exceptions, technical och business. De problem som du får här skulle jag lösa genom att kasta ett businessexception och presentera meddelandet för användaren.
Och varför skulle jag göra så då? Helt enkelt för att det är enklaste och snabbaste sättet att lösa problemet med, visst är det fint med classer och enumerations som man skickar tillbaka när något fel inträffar, men det tar utvecklingstid att sitta och skriva alla dessa enumeration och klasser samt själv hanteringen av dessa när de returneras tillbaka. Och i vanliga windows applikationer så är inte ditt problem prestandan då dessa maskiner knappast är belastade till max.
Så jag skulle helt enkelt skapa en FileErrorExceptions som ärver från min BusinessExceptions och kasta detta fel med ett meddelande att "Filnamnet var tomt, det måste innehålla minst 1 bokstav"...
Sedan skulle jag låta min generella felhanteringsmetod som ligger i Applikation_unhandlerError eventet hantera dessa fel och logga felet samt presenterar en information till användare om att ett fel inträffat, om felet är ett businessexceptions så visas meddelander, om det är ett technicalexceptions så visas ett standardmeddelande som säger att program har stött på ett tekninskt problem och man skall kontakta supporten och så skickas ett ID med som man kan ge till supporten så det kan slå upp felet i en databas.
Däremot om vi pratar centrala komponenter där prestandan är kritiskt så skulle jag inte kastat ett exception, utan loggat ner problemet till en log och sedan returnerat false, sedan är det upp till den applikation som kallat min komponent att hanterar om det kommer true/false tillbaka.
emisson skrev:
Vissa mer troliga andra, men sensmoralen bör vara att om man kan förutsäga och fånga felet själv så ska man göra det.
Jag skulle vilja lägga till inte bara förutse och fånga det, utan att du faktiskt gör något när du fångat felet. Att bara fånga felet och sedan kasta det vidare är det ingen som vinner på. Skall man fånga ett fel nere i sin kod, så gör man det för att man kan hanterar felet i sin kod.
- M