using System;
namespace MyException
{
class InvalidArgumentException : Exception
{
public InvalidArgumentException()
{
}
public InvalidArgumentException(string message)
: base(message)
{
}
// base(message)를 호출하여, 기본 클래스의 생성자를 호출합니다.
// 왜 base(message)를 호출하는가?
// base(message)를 호출하여 기본 클래스의 생성자를 호출하면,
// 사용자 정의 예외 클래스에서 예외 메시지를 사용할 수 있습니다.
// Exception 클래스는 예외를 나타내는 '기본 클래스'이고,
// InvalidArgumentException 클래스는 Exception 클래스를 상속받은 '파생 클래스'.
// InvalidArgumentException 클래스(파생 클래스)의 생성자에서,
// base(message)를 호출하면,
// Exception 클래스(기본 클래스)의 생성자를 호출하여
// 예외 메시지를 초기화합니다.
// 즉, InvalidArgumentException 객체를 생성할 때,
// 예외 메시지를 지정할 수 있도록 하는 것입니다.
// 만약 base(message)를 호출하지 않으면,
// InvalidArgumentException 객체는 예외 메시지를 가지지 않게 됩니다.
// 이처럼 base(message)를 호출하여 기본 클래스의 생성자를 호출하면,
// 사용자 정의 예외 클래스에서 예외 메시지를 사용할 수 있습니다.
public object Argument
{
get;
set;
}
public string Range
{
get;
set;
}
}
class MainApp
{
static uint MergeARGB(uint alpha, uint red, uint green, uint blue)
{
uint[] args = new uint[] { alpha, red, green, blue };
foreach (uint arg in args)
{
if (arg > 255)
throw new InvalidArgumentException()
{
Argument = arg,
Range = "0~255"
};
}
return (alpha << 24 & 0xFF000000) |
(red << 16 & 0x00FF0000) |
(green << 8 & 0x0000FF00) |
(blue & 0x000000FF);
}
static void Main(string[] args)
{
try
{
Console.WriteLine("0x{0:X}", MergeARGB(255, 111, 111, 111));
Console.WriteLine("0x{0:X}", MergeARGB(1, 65, 192, 128));
Console.WriteLine("0x{0:X}", MergeARGB(0, 255, 255, 300));
}
catch (InvalidArgumentException e)
{
Console.WriteLine(e.Message);
Console.WriteLine($"Argument:{e.Argument}, Range:{e.Range}");
}
}
}
}
base(message)를 호출하는 것은 파생 클래스에서 메시지를 사용하기 위해서가 아니라, 기본 클래스의 생성자를 호출하여 예외 메시지를 초기화하기 위해서입니다.
InvalidArgumentException 클래스는 Exception 클래스를 상속받았기 때문에, Exception 클래스의 기능을 사용할 수 있습니다. Exception 클래스는 예외 메시지를 저장하는 필드를 가지고 있으며, 생성자를 통해 이 필드를 초기화합니다.
InvalidArgumentException 클래스의 생성자에서 base(message)를 호출하면, Exception 클래스의 생성자를 호출하여 예외 메시지를 초기화합니다. 즉, InvalidArgumentException 객체를 생성할 때 예외 메시지를 지정할 수 있도록 하는 것입니다.
만약 base(message)를 호출하지 않으면, InvalidArgumentException 객체는 예외 메시지를 가지지 않게 됩니다.
try
{
// ...
throw new InvalidArgumentException("잘못된 인자가 전달되었습니다.");
}
catch (InvalidArgumentException e)
{
Console.WriteLine(e.Message); // "잘못된 인자가 전달되었습니다." 출력
}
이처럼 base(message)를 호출하여 기본 클래스의 생성자를 호출하면, 사용자 정의 예외 클래스에서 예외 메시지를 사용할 수 있습니다.