Avatar billede jan_amdi Nybegynder
14. august 2008 - 09:25 Der er 4 kommentarer

Best practices ved fejl i en DLL

Hejsa

Jeg er igang med et nemt opstartsprojet i C# - Test af cprnr.
I den forbindelse er jeg lidt i tvivl om, hvordan jeg skal forholde mig ved en evt. fejl i koden.
F.eks. har jeg lave en IsValid funktion, som tester om et cprnr er validt. Hvis ikke cprnr er validt, så returneres false, eller true. Så langt så godt.
Så har jeg også en IsMale funktion, som returnerer true hvis det er en mand og false hvis det er en kvinde.
Men hvis cprnummeret ikke er validt, så har jeg nu to muligheder - returner false (hvilket jo faktisk betyder at det ikke er en mand), eller kaste en fejl (hvilket jo så skal fanges af det kaldende program)

Men er det "best practices" at kaste en fejl, hver gang der sker en fejl i en dll, og så lade det være op til det kaldende program at gribe den fejl?
I så fald, så skal man jo næsten pakke alle sine funktionkald ind i en try/catch.
Men er det blot fremgangsmåden, hvis man vil lave sitn program "fejlfrit"?

Med venlig hilsen
Jan Amdi
Avatar billede sherlock Nybegynder
14. august 2008 - 09:31 #1
Du bør lave en exception, hvis du modtager invalide data i andre metoder end IsValid.
Kaldende programmer bør så til gengæld kalde IsValid, hvis der er tvivl om rigtigheden af data i programmet.
Avatar billede jan_amdi Nybegynder
14. august 2008 - 10:20 #2
Tak for det.
Er også den løsningsmetode der lyder mest fornuftigt, og sikre bedste kode. Men var ikke 100% sikker, da det jo også er et spøgsmål om holdning og kodestandard.
Så hvis du sender et svar.... :-)
Avatar billede sherlock Nybegynder
14. august 2008 - 10:50 #3
:)
Avatar billede jydebjerg42 Nybegynder
19. september 2008 - 22:23 #4
Tjah... Sådan som du beskriver din struktur er jeg nok enig med sherlock, men jeg tror nu at jeg selv ville gribe det lidt anderledes an. Det lyder som om at du er interesseret i at behandle cpr numre som objekter du kan udføre en række tests op imod og jeg tror derfor at jeg ville define en cpr nummer klasse hvis constructor tager et cpr nr. Du kan således allerede ved oprettelse af dit objekt sikre dig at data er valide og du skal således kun håndtere exceptions et sted.

class CprNummer
{
  public CprNummer(string cpr)
  {
    if (!this.IsValid(cpr))
    {
      throw new ArgumentException("Supplied cpr is not valid");
    }
    this.cpr = cpr;
  }

  private string cpr;

  private bool IsValid(string cpr)
  {
    //Return true if valid otherwise false
  }

  public bool IsMale
  {
    get
    {
      //Return true if male, otherwise false.
    }
  }
}

Du kan så i din kode anvende det omtrent som følger:

try
{
  CprNummer cpr = new CprNummer("111276-1234");
}
catch (ArgumentException)
{
  //Handle exception
}

if (cpr.IsMale)
{
  //Do something to show that person is male
}
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester