30. november 2006 - 11:37Der er
19 kommentarer og 1 løsning
n-tier execption handling
Hejsa
har lige problemer med at overskue den bedte måde at håndtere execptions på.
har en n-tier løsning og mit problem udspiller sig på BuisnesLogicalLayer og en webside.
på BLL håndtere jeg logik og forindelse til DataAccessLayer.
spørgsmålet er hvor jeg burde håndtere hvad. Hvilke execptions håndtere jeg på BLL og hvilke execptions sender jeg videre til overfladen.
Eks. databasen er nede eller brugeren er alle oprettet. dette vil give 2 forskellige execptions...
fortolker jeg dem på BLL og sender så en ny execption op til webSiden, med en menneskelig forklaring.?? og hvis ja, hvordan håndtere jeg så de forskellige meddelser i websidens kode.
er lidt forvirret her, så håber nogen kender svaret ;)
Undtagelser skal kastes upad i din ntire som du skriver. Er de af ingen relevans for brugeren kan de fint håndteres i BLL og blive slået ned der. Er det en undtagelse skal den selvf. op til brugeren på overfladen, hvor den er tolket og beskrevet. Du kender baggrunden for meddelsen, så du ved hvordan den bedst preæsenteres for brugeren i en label eller pop up eller andet. Det farligste er at kastet den opad og der så ikke er nogen til at modtage den (unhandled). Der hvor du fanger din undtagelse først, ved du mest præcist hvad der er gået galt. Her kan du evt. allerede tolke og lægge en tekst til undtagelse. Når du længere oppe i din lagkodel fanger undtagelsen kan du bedre se hvorfor den blev kastet, se mere om 'inner exception' på http://msdn2.microsoft.com/en-us/library/hdwz4c0s(VS.80).aspx
er dog stadig lidt forvirret. kan ikke rigtig se hvad der ikke skulle være relevant for brugerfladen. Det er vel kun informationen om havd der gik galt, der i visse tilfælde kan værer irellevant for brugeren.
mit billede er pt som følgende: jeg burde sende to typer execptions op til brugeren. en der giver en melding angående ikke fatale fejl. og en Execption der melder fatale fejl. Den sidste kan jo opstå på baggrund af mange forskellige fejl(execptions typer) men resultatet for brugeren er det samme...siden virker ikke(siden er nede)
Et pseudo eks på min nuværende forståelse. -------------------------------------------------------------------- BLL
public metode1(string navn) {
try { //program code } catch(ExceptionType1 ex) { //handle non fatal execption throw new MyExecption1("Brugernavnet findes allerede") } catch(ExceptionType2 ex) { //handle fatal execption throw new MyExecption2("Siden er midlertidig nede"); } catch(ExceptionType3 ex) { //handle fatal execption throw new MyExecption2("Siden er midlertidig nede"); } catch(ExceptionType4 ex) { //handle fatal execption throw new MyExecption2("Siden er midlertidig nede"); }
Jeg syntes det ser fint ud. Bottomline er at du håndtere undtagelser og sender dem op igennem systemet. På websiden skal du nok have en almindelige exception også, hvis der bliver kastet noget du ikke tager hånd om længere nede.
1) brugeren maa aldrig se en exception kun en paen version
=>
altid en catch i UI layer
2) exceptions er en en del af interfacet til et layer
=>
1) exceptions skal dokumenteres 2) exceptions maa ikke vaere implementations specifikke (for alle praktiske formaal betyder det specifikke exceptions for det paagaeldende lag)
3) returner ikke samme exception type bare med forskellig tekst for 2 forskellige slags exceptions
=>
lav en super klasse og et antal sub klasser saa kan den der kalder laget selv vaelge om de skal haandteres ens eller ej
tak for svarene.. arne_v: der blev jeg lidt forvirret.
1)må der kun være en catch på UI?
2,2) forstå den ikke helt ;)
3)hvordan håndtere man så forskellige exTyper og hvilke beskder sender man vidre..sender man bare exTypen vidre...og har så kun en catch på UI, der så i en case/if smager på exTypen og udfra det håndtere den?
ville blive glad for et par gode exempler eller links til nogen :)
så begynder jeg måske at se lidt lys..bare lige et par sidste krampetræk for at sikre at jeg nogenlunde har forstået det ;)
Er ude efter forståelse for hvodan man skal/burde lave 'execption handling' i en n-tier løsning.....
1. Man 'bør' altid lave sin egen myExecptionClass. Hvis man ikke har, bør man håndtere alle execptions på DAL og retunere true/false på BLL forspørgsler(Aldrig sende en system-execption op til BLL)?
1.1 Eller gælder dette kun sqlExecptions?
2. selvom man godt kan have flere catch på UIL, er det så ikke god stil at BLL i de fleste tilfælde grinber de forskellige myExecptions.Subclasses og bare sender disse videre op til DAL, som så altid kun grinber 1 MyExecption.
2.1 hvis ikke, hvad er så god stil mellem Bll og UIL.
3 DAL bør kunne retunere en MyExecption på enhver tænkelig SystemExecption?
RETTELSE: 2. selvom man godt kan have flere catch på UIL, er det så ikke god stil at BLL i de fleste tilfælde grinber de forskellige myExecptions.Subclasses og bare sender disse videre op til UIL, som så altid kun grinber 1 MyExecption.
det var næsten 1 ud af 5 mulige....ikke den bedste start på dagen :)
min forvirren er næsten komplet og forstår godt hvis du opgiver her ;)
forståe ikke 1 og 3.
arne_v:(re 1) aldrig sende en exception op som er specific for implementationen. anders:(re 3) er det ikke det man gør hvis man sender en myExecption op til BLL?
som jeg nu har forstået DAL -> BLL. Når du siger du vil pakke en NullReferenceEx ind, går jeg udfra du mener at lave din egen ExecptionClass.subClass indeholdende dine info om hvor,hvordan, hvorfor og smide den til BLL..... Og kan godt se at der ikke er noget specielt at sige om en OutOfMemory, så denne smides som den er.
Hvad BLL -> UIL angår er jeg stadig rundt på gulvet. Kan godt se at BLL intet ved om UIL og derfor ikke kan tage udgangspunkt i denne, men hvad sender BLL så til UIL. MyExecptions(implementations Specifik) eller SystemExecptions?
håber du orker en sidste runde, da jeg virkelig har et ønske om at forstå og bruge execption handling rigtigt i min kode.
en MyException er en del af dit DAL interface, men SQLServer specifikke eller Oracle specifikke eller XML fil specifikke exceptions er en del af din implementation
der boer ikke smides andree exceptions fordi du skifter fra XML filer til Oracle eller fra Access til SQLServer
2) En komponent 'bør' derfor altid smide en xExecption.SubExecption og kun i sjældne tilfælde sende en implementrings execption vidre op i systemet.
3) Jo flere subExecptions der er, jo flere konfilkter/konfilktetyper er ordentligt håndteret/beskrevet?
hvis du mener jeg nogenlunde har forstået det, så smid kommentaren som et svar og du ska få dig nogle velfortjente point's :)
----------- Tillægs spørgsmål..........hvis du orker ;) -----------
søger somsagt den rigtigt/mest hensigtsmæssige/optimale måde at stukturer og skrive kode på....Eller med andre ord, hvordan ville en haj som dig gøre det ;)
....Så angåedne BLL som modtager myDalExecption.SubExecptions. Du skriver, at så kan BLL selv vælge om den vil gribe myDalExecption eller myDalExecption.SubExecption.
A) Min første tanke var at BLL altid skulle gribe en myDalExecption og så kigge efter subExecptions. På den måde vil der altid kun skulle laves en Catch pr BLL kald??
B) hvis dette er rigtigt. Kan en BLL.class så ikke indeholde en metode som kan smage på alle de myDalExecption.SubExecption den måtte modtage fra DAL og så retunere en myBllExecption.SubExecption. i retnig af--> BLL.class.Metode1 try { //somthing } catch(myDalExecption DalEx) { throw getBllExecption(DalEx); }
getBllExecption(myDalExecption DalEx) { if DalEx typeof DalEx.1 return new myBllExecption.A if DalEx typeof DalEx.2 return new myBllExecption.B if DalEx typeof DalEx.3 return new myBllExecption.C }
Endnu engang tak for hjælpen vi ses nok en anden gang ;)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.