dimitris2006 Δημοσ. 30 Μαΐου 2011 Δημοσ. 30 Μαΐου 2011 Καλησπέρα, έχω μία άσκηση σε 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.
kagelos Δημοσ. 30 Μαΐου 2011 Δημοσ. 30 Μαΐου 2011 Από τον κώδικα που μας δείχνεις δεν φαίνεται πουθενά να γίνεται 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".
παπι Δημοσ. 30 Μαΐου 2011 Δημοσ. 30 Μαΐου 2011 Αν καταλαβα καλα, εχεις την load.Add που πεταει TitleMplaMpla, και σου λενε να βαλεις και στη στην GetCopy; Τωρα γιατι να βαλεις στη GetCopy εφοσον υπαρχει στη load.Add ... εεε επειδη εχεις το παραπανω try (getcopy,add) δε σημαινει οτι σε καθε καλεσμα της GetCopy θα εχεις για συνοδο την Add.
dimitris2006 Δημοσ. 30 Μαΐου 2011 Μέλος Δημοσ. 30 Μαΐου 2011 Από τον κώδικα που μας δείχνεις δεν φαίνεται πουθενά να γίνεται throw κάποιο exception.[...] ναι το συγκεκριμένο throw πρέπει να το κάνω εγώ, το θέμα είναι ότι όπως το σκέφτομαι μου είναι άχρηστο. Δεν υπάρχει τρόπος να συνεχίσει μετά την GetCopy το πρόγραμμα. Εφόσον δεν υπάρχει copy ελεύθερο, θα βγει μία φορά exception στην GetCopy (οκ, δεν υπάρχει αυτή τη στιγμή, δεν είναι τίποτα να το συμπληρώσω) αλλά εφόσον βγει αυτό το exception, το 2ο που υπάρχει στο catch δε θα εκτελεστεί. Και αυτό επειδή η getcopy επιστρέφει πάντα δεδομένα τύπου Copy. Άρα, εάν δεν βρει αντίγραφο δε μπορεί να επιστρέψει κάτι και θα κολλήσει στο exception που θα συμπληρώσω.
defacer Δημοσ. 1 Ιουνίου 2011 Δημοσ. 1 Ιουνίου 2011 Μάλλον πρέπει να διαβάσεις παραπάνω πως δουλεύει το exception handling. Δεν "υπάρχει" κανένα exception στο catch, και τα exceptions δεν "εκτελούνται". Ξεκίνα από την αρχή: http://msdn.microsoft.com/en-us/library/ms173160%28v=VS.100%29.aspx
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.