Προς το περιεχόμενο

C# μπέρδεμα σε άσκηση που χρησιμοποιώ exceptions


dimitris2006

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα, έχω μία άσκηση σε C# και έχω μπερδευτεί με κάποια exceptions. Στο κομμάτι που βρίσκομαι τώρα, ο κώδικας ελέγχει εάν υπάρχουν διαθέσιμα αντίτυπα ενός βιβλίου για δανεισμό.

 

>try
           {
               Title title = (Title)lstTitles.SelectedItem;
               Copy copy = title.GetCopy();
               Loan newLoan = new Loan(copy, member);
               loans.Add(newLoan);
           }
           catch(TitleNotAvailableException ex)
           {
               MessageBox.Show(String.Format(
                   "{0} not available: {1} on loan",
                   ex.TitleName,ex.CopiesOnLoan));
           }

 

Ουσιαστικά, βρίσκει με το GetCopy εάν υπάρχει διαθέσιμο αντίτυπο και στη συνέχεια κάνει το loan. Το πρόβλημα για μένα είναι ότι στην εκφώνηση ζητάει και μέσα στο GetCopy να βάλω ένα exception που να ελέγχει εάν υπάρχει διαθέσιμο αντίτυπο. Πιστεύω ότι εάν λειτουργήσει το exception του Getcopy δε θα φτάσει ποτέ στο "catch(TitleNotAvailableException ex)" άρα τσάμπα υπάρχει το τελευταίο.

 

>public Copy GetCopy()
       {                  
               for (int i = 0; i < copiesarray.Count; i++)
               {
                   if ((copiesarray[i]).IsAvailable)
                   {
                       copiesarray[i].ToggleIsAvailable();
                       return (copiesarray[i]);   
                   }
               }
       }

 

Είναι ιδέα μου ή όχι πως ότι και να κάνω αν δεν υπάρχει διαθέσιμο αντίτυπο θα λειτουργήσει μόνο το 1ο exception και ουσιαστικά το 2ο είναι άχρηστο; Απλά το πρώτι κομμάτι κώδικα είναι μέρος της εκφώνησης στην οποία διευκρινίζει ότι exception θα πρέπει να υπάρχει και μέσα στο GetCopy.

Δημοσ.

Από τον κώδικα που μας δείχνεις δεν φαίνεται πουθενά να γίνεται throw κάποιο exception. Συγκεκριμένα το try catch πιάνει μόνο TitleNotAvailableException, όχι τα πάντα. Αν δεν γίνεται κάπου throw ένα TitleNotAvailableException, ενδεχομένως να έπρεπε να το κάνεις έτσι :

 

>public Copy GetCopy()
{                  
  for (int i = 0; i < copiesarray.Count; i++)
  {
     if ((copiesarray[i]).IsAvailable)
     {
        copiesarray[i].ToggleIsAvailable();
        return (copiesarray[i]);   
     }
  }

  //Εφόσον φτάσει εδώ, δεν βρέθηκε κάποιο αντίγραφο
  throw new TitleNotAvailableException(... δεν ξέρω τι παραμέτρους παίρνει ...);
}

 

Τώρα μάλιστα που το ξανασκέφτομαι, η μέθοδος GetCopy δεν μπορεί να κάνει compile έτσι όπως την έχεις. Θα έπρεπε να σου βγάζει "Not all code paths return a value".

Δημοσ.

Αν καταλαβα καλα, εχεις την load.Add που πεταει TitleMplaMpla, και σου λενε να βαλεις και στη στην GetCopy; Τωρα γιατι να βαλεις στη GetCopy εφοσον υπαρχει στη load.Add ... εεε επειδη εχεις το παραπανω try (getcopy,add) δε σημαινει οτι σε καθε καλεσμα της GetCopy θα εχεις για συνοδο την Add.

Δημοσ.

Από τον κώδικα που μας δείχνεις δεν φαίνεται πουθενά να γίνεται throw κάποιο exception.[...]

ναι το συγκεκριμένο throw πρέπει να το κάνω εγώ, το θέμα είναι ότι όπως το σκέφτομαι μου είναι άχρηστο. Δεν υπάρχει τρόπος να συνεχίσει μετά την GetCopy το πρόγραμμα. Εφόσον δεν υπάρχει copy ελεύθερο, θα βγει μία φορά exception στην GetCopy (οκ, δεν υπάρχει αυτή τη στιγμή, δεν είναι τίποτα να το συμπληρώσω) αλλά εφόσον βγει αυτό το exception, το 2ο που υπάρχει στο catch δε θα εκτελεστεί. Και αυτό επειδή η getcopy επιστρέφει πάντα δεδομένα τύπου Copy. Άρα, εάν δεν βρει αντίγραφο δε μπορεί να επιστρέψει κάτι και θα κολλήσει στο exception που θα συμπληρώσω.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...