본문 바로가기
Programming/C#

C# 예외 처리

by ahhang0k 2021. 4. 30.

예외처리

프로그램이 실행되는 동안 문제가 발생하면 프로그램이 자동으로 중단됩니다.

이럴 경우에 프로그램이 대처할 수 있도록 처리하는 것이 예외 처리(Exception Handling)라고 합니다.

프로그램 실행 중에 발생하는 오류를 예외(Exception)라고 하고, 프로그래밍 언어의 문법적인 오류를 에러(Error)라고 합니다.

 

 

 

1) 예외처리 첫번째 방법 try/catch

try의 위에서부터 아래로 실행하면서 예외를 만나면 바로 catch로 바로 이동이 되고 다시 try로 돌아가지 않는다.

 

< 선언 >

try{

  예외가 발생할 상황을 넣는곳

}catch{

  예외가 발생했을때 어떻게 처리 할 것인지 넣는곳

}

 

ex1) 20/0을 시도 했더니 안되서 콘솔창에 System.DivideByZeroException 같은 말이 콘솔창에 떴다. 이럴 경우 catch()안에 DivideByZeroException을 넣어 오류를 잡아준다.

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

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int b = 20;
            int a = 0;
            int c = 0;
            int total = 0;
            int sub = 0;

            try
            {
                c = b / a;
                total = a + b;
                sub = b - a;
            }
            catch(DivideByZeroException) // 오류가 생겼던 말을 catch()에 넣어줌
            {
                a = 2;
                c = b / a;
            }
            Console.WriteLine(c);
            Console.WriteLine(total);
            Console.WriteLine(sub);

        }
    }
}

 

ex2) 모든 예외를 잡아주는 Exception으로 처리하는 경우

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

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int b = 20;
            int a = 0;
            int c = 0;
            int total = 0;
            int sub = 0;

            try
            {
                c = b / a;
                total = a + b;
                sub = b - a;
            }
            catch(Exception) //모든 exceptio을 잡아줌
            {
                a = 2;
                c = b / a;
            }
            Console.WriteLine(c);
            Console.WriteLine(total);
            Console.WriteLine(sub);

        }
    }
}

 

ex3) FormatException에 관한 예제

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

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] stringNumber = { "23", "12", "998", "3.141592" };
            try
            {
                for(int i=0; i<stringNumber.Length; i++)
                {
                    int j = int.Parse(stringNumber[i]);
                    Console.WriteLine("숫자로 변환된 값은" + j);
                }
            }
            catch(FormatException)
            {
                Console.WriteLine("정수로 변환할 수 없습니다.");
            }

        }
    }
}

 

 

 

2)예외 처리의 두번쨰 방법 try/catch

try는 한개 catch는 여러개를 사용

catch에서 Exception을 사용할 거면 마지막 catch에 넣어주도록 해야함

 

<선언>

try{



}catch{

}catch{

}

 

 

3) 예외 처리 세번쨰 방법 try/catch/finally

<선언>

try{

}catch{

}finally{
  무조건 실행되는 문장;
}

ex1) try -catch - finally를 이용한 경우

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

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            int value = 20;
            int div = 2;
            int[] intArray = { 1, 2, 3 };
            try
            {
                int result = value / div;
                Console.WriteLine(result);

                int arrayValue = intArray[1];
                Console.WriteLine(arrayValue);
            }
            catch(DivideByZeroException ae)
            {
                Console.WriteLine("0으로 나눌수없음");
            }catch(IndexOutOfRangeException ae)
            {
                Console.WriteLine("배열의 범위를 넘음");
            }
            finally
            {
                Console.WriteLine("예외가 발생했음");
            }
           
            

            
        }
    }
}

 

 

종합 예제

두수를 입력받아 나눗셈 연산을 수행하는 프로그램

  • 힌트
  • 입력된 두 수를 정수값으로 바꾸어 나눗셈한다.
  • 모든가능한 예외사항에 대한 처리를 한다,
    •  입력한 값이 숫자가 아닐 경우의 예외처리
    •  0으로 나누는 경우에 해당하는 예외처리
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {

            try
            {
                int num1, num2;

                System.Console.Write("숫자 1 입력 (정수) : ");
                num1 = int.Parse(System.Console.ReadLine());

                Console.Write("숫자 2 입력 (정수) : ");
                num2 = int.Parse(Console.ReadLine());

                int divide = num1 / num2;
                Console.WriteLine(divide);
            }
            catch (DivideByZeroException)
            {
                Console.WriteLine("0은 안되요! 다른 숫자를 입력해주세요");         

            }
            catch (FormatException e)
                {
                Console.WriteLine("문자열을 안되요 다른 값으로 넣어주세요");
            }

       

        }
    }
}

댓글