when은 예외를 걸러낼 때 쓰는 키워드예요. catch문 뒤에 오고, 그 시점에 스코프 안에 있는 어떤 값이든 담을 수 있는 불리언 표현식을 받을 수 있어요. 표현식이 true로 평가되면 그 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의 생성자 정의를 완성해요. 이 생성자는 계산기가 던진 예외와, 예외가 발생한 시점에 처리 중이던 피연산자를 저장(래핑)해야 해요.
생성자에 전달된 Calculator 인스턴스의 Calculator.Multiply() 메서드를 호출하면서 x와 y 정수 값을 전달하는 CalculatorTestHarness.Multiply() 메서드를 구현해요. 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.Multiply() 메서드를 호출하는 CalculatorTestHarness.TestMultiplication() 메서드를 구현해요. "Multiply succeeded"가 반환돼요.
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(6, 7);
// => "Multiply succeeded"
CalculatorTestHarness.TestMultiplication() 메서드를 수정해서, 정수 인자 두 개가 모두 음수(0보다 작음)이면 "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개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.