사용자 정의 예외 클래스

00·2024년 12월 24일

C#

목록 보기
70/149

using System;

/*
사용자 정의 예외 클래스:
C#에서 모든 예외 객체는 System,Exception 클래스로부터 파생되어야 합니다.
따라서 Exception 클래스를 상속하기만 하면 새로운 예외 클래스를 만들 수 있습니다.

사용 이유?
.NET은 100개가 넘는 예외 형식을 제공하기 때문에 사용자 정의 예외는 자주 필요하진 않습니다.
하지만 특별한 데이터를 담아서 예외 처리 루틴에 추가 정보를 제공하고 싶거나,
예외 상황을 더 잘 설명하고 싶을 때 필요합니다.
*/

// 사용자 정의 예외 클래스를 사용하는 방법을 보여줌
// InvalidArgumentException이라는 사용자 정의 예외 클래스를 정의하고,
// MergeARGB 메서드에서 이 예외를 발생시킵니다.
namespace MyException
{
class InvalidArgumentException : Exception // Exception 클래스를 상속받아
// InvalidArgumentException이라는
// 사용자 정의 예외 클래스를 선언함.
// Argument 프로퍼티와 Range 프로퍼티를 추가하여
// 예외 정보를 저장합니다.
{
public InvalidArgumentException() // 매개변수가 없는 생성자입니다.
{
}

    public InvalidArgumentException(string message) 
        : base(message) // 문자열 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
{

    // MergeARGB() 메서드: alpha, red, green, blue 값을 입력으로 받아
    // ARGB 색상 값을 반환하는 메서드입니다.
    static uint MergeARGB(uint alpha, uint red, uint green, uint blue)
    {
        uint[] args = new uint[] { alpha, red, green, blue }; // alpha, red, green, blue 값을
                                                              // 배열 args에 저장합니다.

        foreach (uint arg in args) // args 배열의 각 요소를 순회합니다.
        {
            if (arg > 255) // 만약 arg 값이 255보다 크면,
                throw new InvalidArgumentException() // InvalidArgumentException 예외를 발생시킵니다.
                {
                    Argument = arg, // 예외가 발생한 인자를 Argument 프로퍼티에 저장합니다.
                    Range = "0~255" // 인자의 유효한 범위를 Range 프로퍼티에 저장합니다.
                };
        }

        return (alpha << 24 & 0xFF000000) |
               (red << 16 & 0x00FF0000) |
               (green << 8 & 0x0000FF00) |
               (blue & 0x000000FF);// alpha, red, green, blue 값을 사용하여
                                   // ARGB 색상 값을 계산하고 반환합니다.
    }


    // Main() 메서드: try-catch 문을 사용하여 
    // InvalidArgumentException 예외를 처리하고, 예외 정보를 출력합니다.
    static void Main(string[] args)
    {
        try // MergeARGB 메서드를 호출하여 ARGB 색상 값을 계산하고 출력합니다.
        {
            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) // InvalidArgumentException 예외가 발생하면,
                                           // 예외 메시지와 함께
                                           // Argument 프로퍼티와 Range 프로퍼티 값을 출력합니다.
        {
            Console.WriteLine(e.Message);
            Console.WriteLine($"Argument:{e.Argument}, Range:{e.Range}");

        }

    }
}

}

/*
출력 결과

0xFF6F6F6F
0x141C080
Exception of type 'MyException.InvalidArgumentException' was thrown.
Argument:300, Range:0~255
*/

0개의 댓글