when é a palavra-chave para filtrar exceções. Coloca-se depois da instrução catch e pode receber uma expressão Boolean que contenha quaisquer valores que estejam no âmbito naquele momento. Se a expressão for avaliada como true, o bloco associado a essa instrução catch é executado; caso contrário, verifica-se a instrução catch seguinte, se existir.
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.
}
Uma exceção definida pelo utilizador é qualquer classe definida no teu código que derive de System.Exception. Está sujeita a todas as regras de herança de classes, mas, além disso, o compilador e o runtime da linguagem tratam estas classes de uma forma especial, que permite que as suas instâncias sejam lançadas e capturadas fora do fluxo de controlo normal, como se explica no exercício exceptions.
As exceções definidas pelo utilizador são frequentemente usadas para transportar informação extra, como uma mensagem e outros dados relevantes, que fica disponível para as rotinas que as capturam.
Enquanto trabalhas na Instruments of Texas, tens como tarefa trabalhar numa calculadora experimental escrita em C#. Estás a construir uma estrutura de testes para verificar várias funções da calculadora, começando pela multiplicação. Vais ver que há uma preocupação especial quando os dois operandos da multiplicação são negativos.
A classe Calculator já te foi fornecida e não deve ser modificada.
CalculationException
Completa a definição do construtor de CalculationException, que terá de armazenar (envolver) qualquer exceção lançada pela calculadora, bem como os operandos que estão a ser processados no momento em que a exceção é lançada.
Implementa o método CalculatorTestHarness.Multiply(), que deve chamar o método Calculator.Multiply() da instância de Calculator passada ao construtor, passando os valores inteiros x e y. Se ocorrer um transbordo no método Calculator.Multiply(), este lança uma OverflowException. Esta exceção deve ser capturada no método CalculatorTestHarness.Multiply() e envolvida numa CalculationException, e os valores x e y que estão a ser passados devem ser armazenados como operandos da exceção. O objeto CalculationException acabado de criar deve ser lançado. Podes ignorar o valor devolvido pelo método Calculator.Multiply() se este for bem-sucedido.
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 o método CalculatorTestHarness.TestMultiplication(), que recebe dois inteiros e chama o método CalculatorTestHarness.Multiply(). É devolvido "Multiply succeeded".
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(6, 7);
// => "Multiply succeeded"
Modifica o método CalculatorTestHarness.TestMultiplication() para que seja devolvido "Multiply failed for negative operands. <INNER_EXCEPTION_MESSAGE>" se ambos os argumentos inteiros forem negativos (menores que zero).
O marcador de posição <INNER_EXCEPTION_MESSAGE> deve ser substituído pela mensagem da exceção interna da CalculationException.
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(-2, -Int32.MaxValue);
// => "Multiply failed for negative operands. " + innerException.Message
Modifica o método CalculatorTestHarness.TestMultiplication() para que seja devolvido "Multiply failed for mixed or positive operands. <INNER_EXCEPTION_MESSAGE>" se pelo menos um dos argumentos inteiros não for negativo.
O marcador de posição <INNER_EXCEPTION_MESSAGE> deve ser substituído pela mensagem da exceção interna da CalculationException.
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(Int32.MaxValue, Int32.MaxValue);
// => "Multiply failed for mixed or positive operands. " + innerException.Message
Inscreve-te no Exercism para aprenderes e dominares C# com 62 conceitos178 exercícios, e mentoria humana real, tudo grátis.