when é a palavra-chave para filtrar exceções. Ela fica depois da instrução catch e pode receber uma expressão Boolean que contenha quaisquer valores que estejam no escopo naquele momento. Se a expressão for avaliada como verdadeira, o bloco associado a essa instrução catch é executado. Caso contrário, a próxima instrução catch, se houver, é verificada.
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 usuário é qualquer classe definida no seu código que derive de System.Exception. Ela está sujeita a todas as regras de herança de classes, mas, além disso, o compilador e o runtime da linguagem tratam essas classes de um jeito especial, permitindo que suas instâncias sejam lançadas e capturadas fora do fluxo de controle normal, como discutido no exercício exceptions.
Exceções definidas pelo usuário costumam servir para carregar informações extras, como uma mensagem e outros dados relevantes, que ficam disponíveis para as rotinas de captura.
Trabalhando na Instruments of Texas, você fica encarregado de uma calculadora experimental escrita em C#. Você está montando um harness de testes para verificar várias funções da calculadora, começando pela multiplicação. Você vai notar que há uma preocupação especial quando os dois operandos da multiplicação são negativos.
A classe Calculator já foi fornecida para você e não deve ser modificada.
CalculationException
Complete a definição do construtor de CalculationException, que precisará armazenar (encapsular) qualquer exceção lançada pela calculadora, bem como os operandos que estão sendo processados no momento em que a exceção é lançada.
Implemente o método CalculatorTestHarness.Multiply(), que deve chamar o método Calculator.Multiply() da instância de Calculator passada para o construtor, passando os valores inteiros x e y. Se ocorrer um overflow no método Calculator.Multiply(), ele vai lançar uma OverflowException. Essa exceção deve ser capturada no método CalculatorTestHarness.Multiply() e encapsulada em uma CalculationException, e os valores x e y que estão sendo passados devem ser armazenados como os operandos da exceção. O objeto CalculationException recém-criado deve ser lançado. Você pode ignorar o valor retornado pelo método Calculator.Multiply() se ele 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
Implemente o método CalculatorTestHarness.TestMultiplication(), que recebe dois inteiros e chama o método CalculatorTestHarness.Multiply(). "Multiply succeeded" é retornado.
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(6, 7);
// => "Multiply succeeded"
Modifique o método CalculatorTestHarness.TestMultiplication() para que "Multiply failed for negative operands. <INNER_EXCEPTION_MESSAGE>" seja retornado se os dois argumentos inteiros forem negativos (menores que zero).
O espaço reservado <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
Modifique o método CalculatorTestHarness.TestMultiplication() para que "Multiply failed for mixed or positive operands. <INNER_EXCEPTION_MESSAGE>" seja retornado se pelo menos um dos argumentos inteiros não for negativo.
O espaço reservado <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
Crie sua conta no Exercism para aprender e dominar C# com 62 conceitos178 exercícios e mentoria humana de verdade, tudo de graça.