Το when είναι η λέξη-κλειδί για το φιλτράρισμα των εξαιρέσεων. Τοποθετείται μετά την εντολή catch και μπορεί να πάρει μια έκφραση Boolean (λογική τιμή) που περιέχει οποιεσδήποτε τιμές βρίσκονται στο πεδίο εμβέλειας εκείνη τη στιγμή. Αν η έκφραση είναι αληθής, τότε εκτελείται το μπλοκ που σχετίζεται με αυτή την εντολή catch, αλλιώς ελέγχεται η επόμενη εντολή catch, αν υπάρχει.
try
{
// do stuff
}
catch (Exception ex) when (ex.Message != "")
{
// output the message when it is not empty
}
catch (Exception ex)
{
// show stack trace or something.
}
Μια εξαίρεση οριζόμενη από τον χρήστη είναι οποιαδήποτε κλάση ορίζεις στον κώδικά σου και η οποία προέρχεται από το System.Exception. Υπόκειται σε όλους τους κανόνες της κληρονομικότητας κλάσεων, αλλά επιπλέον ο μεταγλωττιστής και ο χρόνος εκτέλεσης της γλώσσας αντιμετωπίζουν αυτές τις κλάσεις με ειδικό τρόπο, επιτρέποντας τη ρίψη και τη σύλληψη των στιγμιοτύπων τους έξω από την κανονική ροή ελέγχου, όπως συζητήθηκε στην άσκηση exceptions.
Οι εξαιρέσεις οριζόμενες από τον χρήστη χρησιμοποιούνται συχνά για να μεταφέρουν επιπλέον πληροφορίες, όπως ένα μήνυμα και άλλα σχετικά δεδομένα, ώστε αυτές να γίνουν διαθέσιμες στις ρουτίνες που συλλαμβάνουν την εξαίρεση.
Ενώ εργάζεσαι στην Instruments of Texas, σου έχει ανατεθεί να δουλέψεις πάνω σε μια πειραματική αριθμομηχανή γραμμένη σε C#. Φτιάχνεις ένα πλαίσιο δοκιμών για να επαληθεύσεις μια σειρά από λειτουργίες της αριθμομηχανής, ξεκινώντας από τον πολλαπλασιασμό. Θα δεις ότι υπάρχει ιδιαίτερη ανησυχία όταν οι δύο τελεστέοι του πολλαπλασιασμού είναι αρνητικοί.
Η κλάση Calculator σου έχει δοθεί και δεν πρέπει να τροποποιηθεί.
CalculationException που ορίζει ο χρήστηςΣυμπλήρωσε τον ορισμό του κατασκευαστή της CalculationException, ο οποίος θα πρέπει να αποθηκεύει (να περιτυλίγει) κάθε εξαίρεση που πετάει η αριθμομηχανή, καθώς και τους τελεστέους που επεξεργάζονται τη στιγμή που πετιέται η εξαίρεση.
Υλοποίησε τη μέθοδο CalculatorTestHarness.Multiply(), η οποία θα πρέπει να καλεί τη μέθοδο Calculator.Multiply() του στιγμιότυπου Calculator που περνιέται στον κατασκευαστή, περνώντας της τις ακέραιες τιμές x και y. Αν προκύψει υπερχείλιση στη μέθοδο Calculator.Multiply(), αυτή θα πετάξει μια OverflowException. Αυτή η εξαίρεση θα πρέπει να πιαστεί στη μέθοδο CalculatorTestHarness.Multiply() και να περιτυλιχθεί σε μια CalculationException, και οι τιμές x και y που περνιούνται θα πρέπει να αποθηκευτούν ως τελεστέοι της εξαίρεσης. Το νεοδημιουργημένο αντικείμενο CalculationException θα πρέπει να πεταχτεί. Μπορείς να αγνοήσεις την τιμή που επιστρέφει η μέθοδος Calculator.Multiply() αν πετύχει.
var cth = new CalculatorTestHarness(new Calculator());
cth.Multiply(Int32.MaxValue, Int32.MaxValue);
// => throws an instance of CalculationException
var cth2 = new CalculatorTestHarness(new Calculator());
cth2.Multiply(3, 2);
// => silently exits
Υλοποίησε τη μέθοδο CalculatorTestHarness.TestMultiplication(), η οποία παίρνει δύο ακέραιους και καλεί τη μέθοδο CalculatorTestHarness.Multiply(). Επιστρέφεται το "Multiply succeeded".
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(6, 7);
// => "Multiply succeeded"
Τροποποίησε τη μέθοδο CalculatorTestHarness.TestMultiplication() ώστε να επιστρέφεται το "Multiply failed for negative operands. <INNER_EXCEPTION_MESSAGE>" αν και τα δύο ακέραια ορίσματα είναι αρνητικά (μικρότερα του μηδενός).
Το σύμβολο κράτησης θέσης <INNER_EXCEPTION_MESSAGE> θα πρέπει να αντικατασταθεί με το μήνυμα της εσωτερικής εξαίρεσης της CalculationException.
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(-2, -Int32.MaxValue);
// => "Multiply failed for negative operands. " + innerException.Message
Τροποποίησε τη μέθοδο CalculatorTestHarness.TestMultiplication() ώστε να επιστρέφεται το "Multiply failed for mixed or positive operands. <INNER_EXCEPTION_MESSAGE>" αν τουλάχιστον ένα από τα ακέραια ορίσματα δεν είναι αρνητικό.
Το σύμβολο κράτησης θέσης <INNER_EXCEPTION_MESSAGE> θα πρέπει να αντικατασταθεί με το μήνυμα της εσωτερικής εξαίρεσης της CalculationException.
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(Int32.MaxValue, Int32.MaxValue);
// => "Multiply failed for mixed or positive operands. " + innerException.Message
Γράψου στο Exercism για να μάθεις και να κατακτήσεις C# με 62 έννοιες178 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.