C# 예외 처리(try~catch, exception, throw, finally)

728x90
  • try ~ catch 키워드

- 프로그램의 안정성

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _111_try_catch
{
    class Program
    {
        static void Main(string[] args)
        {
            int inputNum = 0;
            bool isCorrect = false;

            while(!isCorrect)
            {
                Console.WriteLine("입력문자 : ");
                string readStr = Console.ReadLine();

                try
                {
                    inputNum = int.Parse(readStr);
                    isCorrect = true;
                }
                catch(FormatException e)
                {
                    Console.WriteLine(e.Message);
                    Console.WriteLine("입력문자 : " + readStr + "정수 입력 하세요");
                }
            }
            Console.WriteLine("inputNum : " + inputNum);
        }
    }
}

 

  • System.Exception

- 예외 클래스의 Base

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _112_Exception
{
    class Program
    {
        static void Main(string[] args)
        {
            int maxNum = 10;

            try
            {
                checked
                {
                    maxNum += Int32.MaxValue;
                }
            }
            catch(OverflowException e)
            {
                Console.WriteLine("e.Message : " + e.Message);
                Console.WriteLine("e.Source : " + e.Message);
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
            Console.WriteLine("maxNum : " + maxNum);
        }
    }
}

 

  • throw 키워드

- 상위 호출 메소드로 예외 객체를 전달

- 조건 연산자에서 사용

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _113_throw
{
    class Program
    {
        static void ThrowFunc(int data)
        {
            if(data > 0)
            {
                Console.WriteLine("ThrowFunc data : " + data);
            }
            else
            {
                throw new Exception("data에 0이 입력되었습니다.");
            }
        }
        static int ThrowDivision(int a, int b)
        {
            if (a > 0 && b > 0)
                return a / b;
            else
                throw new Exception("0보다 작은 값은 불가합니다.");
        }
        static void Main(string[] args)
        {
            try
            {
                ThrowFunc(10);
                ThrowFunc(100);
                ThrowFunc(0);
                ThrowFunc(1000);
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
            try
            {
                Console.WriteLine("100/20 : " + ThrowDivision(100, 20));
                Console.WriteLine("10/5 : " + ThrowDivision(10,5));
                Console.WriteLine("10/0 : " + ThrowDivision(10, 0));
                Console.WriteLine("100/100" + ThrowDivision(100, 100));
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
            int? a = null;
            try
            {
                int b = a ?? throw new ArgumentNullException();
            }
            catch(ArgumentNullException e)
            {
                Console.WriteLine(e.Message);
            }
            int result = 101;
            try
            {
                int checkNum = (result < 100) ? result : throw new Exception("100 이하만 가능");
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

 

  • try ~ catch ~ finally 키워드

- 예외 상황과 관련 없이 무조건 처리

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _114_finally
{
    class Program
    {
        static void ThrowFunc(int data)
        {
            if(data > 0)
            {
                Console.WriteLine("ThrowFunc data : " + data);
            }
            else
            {
                throw new Exception("data에 0이 입력되었습니다.");
            }
        }
        static void Main(string[] args)
        {
            try
            {
                ThrowFunc(10);
                ThrowFunc(100);
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                Console.WriteLine(" finally 무조건 실행  \n");
            }

            try
            {
                ThrowFunc(0);
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                Console.WriteLine(" fianlly 무조건 실행 ");
            }
        }
    }
}

 

  • 사용자 정의 예외 클래스

- 기존 예외처리 클래스에서 상속

- when 키워드, StackTrace 키워드

ystem;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _115_CustomException
{
    class MyException : ApplicationException
    {
        public int Num { get; set; }
        public MyException():base()
        {

        }
        public MyException(int a)
        {
            Num = a;
        }
        public override string ToString()
        {
            return "Num : " + Num;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            string readStr = Console.ReadLine();
            try
            {
                int num = int.Parse(readStr);

                if (num == 0 || num == 10)
                    throw new MyException(num);
            }
            catch(MyException e) when(e.Num == 0)
            {
                Console.WriteLine("when(e.Num == 0)");
                Console.WriteLine("MyException : " + e.Num);
                Console.WriteLine("MyException : " + e.StackTrace);
            }
            catch(MyException e) when(e.Num == 10)
            {
                Console.WriteLine("when(e.Num == 10)");
                Console.WriteLine("MyException : " + e.Num);
                Console.WriteLine("MyException : " + e.ToString());
                Console.WriteLine("MyException : " + e.StackTrace);
            }
        }
    }
}

728x90