base()

00·2024년 12월 24일

C#

목록 보기
71/149
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)를 호출하여 기본 클래스의 생성자를 호출하면, 사용자 정의 예외 클래스에서 예외 메시지를 사용할 수 있습니다.

0개의 댓글