when è la parola chiave per filtrare le eccezioni. Si mette dopo l'istruzione catch e può accettare un'espressione booleana che contenga qualsiasi valore sia nello scope in quel momento. Se l'espressione restituisce true, allora viene eseguito il blocco associato a quell'istruzione catch; altrimenti si passa a controllare l'istruzione catch successiva, se c'è.
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.
}
Un'eccezione definita dall'utente è una classe qualsiasi definita nel tuo codice che deriva da System.Exception. È soggetta a tutte le regole dell'ereditarietà tra classi, ma in più il compilatore e il runtime del linguaggio trattano queste classi in modo speciale, permettendo di lanciare e catturare le loro istanze al di fuori del normale flusso di controllo, come abbiamo visto nell'esercizio exceptions.
Le eccezioni definite dall'utente servono spesso a trasportare informazioni aggiuntive, come un messaggio e altri dati rilevanti, da rendere disponibili alle routine che le catturano.
Mentre lavori presso Instruments of Texas, ti viene affidato il compito di lavorare su una calcolatrice sperimentale scritta in C#. Stai costruendo un banco di prova per verificare alcune funzioni della calcolatrice, a cominciare dalla moltiplicazione. Ti accorgerai che c'è una particolare attenzione quando i due operandi della moltiplicazione sono negativi.
La classe Calculator ti è stata fornita e non va modificata.
CalculationException
Completa la definizione del costruttore di CalculationException, che dovrà memorizzare (incapsulare) qualsiasi eccezione lanciata dalla calcolatrice, oltre agli operandi che vengono elaborati nel momento in cui l'eccezione viene lanciata.
Implementa il metodo CalculatorTestHarness.Multiply(), che deve chiamare il metodo Calculator.Multiply() dell'istanza di Calculator passata al costruttore, passando i valori interi x e y. Se nel metodo Calculator.Multiply() si verifica un overflow, viene lanciata un'OverflowException. Questa eccezione va intercettata nel metodo CalculatorTestHarness.Multiply() e incapsulata in una CalculationException, e i valori x e y in gioco vanno memorizzati come operandi dell'eccezione. L'oggetto CalculationException appena creato va lanciato. Puoi ignorare il valore restituito dal metodo Calculator.Multiply() se l'operazione riesce.
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
Implementa il metodo CalculatorTestHarness.TestMultiplication(), che prende due numeri interi e chiama il metodo CalculatorTestHarness.Multiply(). Viene restituito "Multiply succeeded".
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(6, 7);
// => "Multiply succeeded"
Modifica il metodo CalculatorTestHarness.TestMultiplication() in modo che venga restituito "Multiply failed for negative operands. <INNER_EXCEPTION_MESSAGE>" se entrambi gli argomenti interi sono negativi (minori di zero).
Il segnaposto <INNER_EXCEPTION_MESSAGE> va sostituito con il messaggio dell'eccezione interna della CalculationException.
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(-2, -Int32.MaxValue);
// => "Multiply failed for negative operands. " + innerException.Message
Modifica il metodo CalculatorTestHarness.TestMultiplication() in modo che venga restituito "Multiply failed for mixed or positive operands. <INNER_EXCEPTION_MESSAGE>" se almeno uno degli argomenti interi non è negativo.
Il segnaposto <INNER_EXCEPTION_MESSAGE> va sostituito con il messaggio dell'eccezione interna della CalculationException.
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(Int32.MaxValue, Int32.MaxValue);
// => "Multiply failed for mixed or positive operands. " + innerException.Message
Iscriviti a Exercism per imparare e padroneggiare C# con 62 concetti178 esercizi e il mentoring di persone reali, tutto gratis.