midas+son의 크리에이티브(creative) 이야기

//예외처리 - try, catch, finally


//예전에 java랑 Jsp 다룰때 꽤 많이 썼었다.(try, catch 안쓰면 컴파일 에러나는 것도 꽤 있었다.)


//쉽게 생각하자.

//try - 하다가 (문제가 없어야 되는게 맞지만문제가 생기면

//catch - 잡는다.(문제가 없으면 잡을 것도 없다.)

//finally - 마지막으로 문제가 있든 없든 실행할 코드 - 안써도 됨.


    class ExceptionTest    //일부러 에러 내보기 위한 class생성

    {

        public int i = 10;

    }


    class Program

    {

//함수로 에러발생이 나게 만들어 보자 - 아래의 main함수 먼저 보고 돌아오자.

        static void TestDiv(int n1, int n2)

        {

            if(n2==0)

            {

                //커스텀 Exception - 내가만든 에러 메세지

                throw new Exception("n2는 0이 아니어야 한다.");

            }


            Console.WriteLine("n1 / n2 함수");

            Console.WriteLine("{0} / {1} = {2}", n1, n2, n1 / n2);

        }


//메인 함수

        static void Main(string[] args)

        {

            ExceptionTest t = null;


            //예외 처리

            try

            {

                //위험 요소가 있는 코드를 작성

                Console.WriteLine("Test : {0}", t.i);

            }

            catch (NullReferenceException e)  //특정 예외만 골라내기 - new되지 않는 class사용하려고 함

            {

                //try 부분에서 에러가 발생하면 catch 소스로 접근

                //프로그램을 죽이지 않고 처리하기 위한 방법

                Console.WriteLine("널 참조 예외가 발생");

                Console.WriteLine(e.Message);   //한글로 간략 오류 설명

                Console.WriteLine("=======================");

                Console.WriteLine(e);   //예외 메세지 전체

            }

            //catch를 여러개 사용할 수 있는데 위에서 먼저 잡히면 아래껀 무시

            catch (Exception e) //모든 예외 

            {

                //try 부분에서 에러가 발생하면 catch 소스로 접근

                //프로그램을 죽이지 않고 처리하기 위한 방법

                Console.WriteLine("예외가 발생함.");

                Console.WriteLine(e.Message);   //한글로 간략 오류 설명

                //Console.WriteLine("=======================");

                //Console.WriteLine(e);   //예외 메세지 전체

            }

            finally

            {

                //예외가 발생 하든 안하든 

                //무조건 들어와서 실행되는 영역.

                Console.WriteLine("try 마지막");

            }


//0으로 나눌때 에러를 발생해보자

            try

            {

                Console.WriteLine("10/0 = ?");

                //int n1 = 10 / 0; //에러 - 0으로 나눌 수 없어서 빨간줄

                int n1 = 10;

                int n2 = 0;

                //int n3 = n1 / n2;

                //Console.WriteLine("{0} / {1} = {2}", n1, n2, n3);

                TestDiv(n1, n2);

            }

            catch(DivideByZeroException e)    //0으로 나눌때 잡는 Exception

            {

                Console.WriteLine("0으로 나누려고 함");

                Console.WriteLine(e);

            }

            catch (Exception e)

            {

                Console.WriteLine("에러!!!!!!!");

                Console.WriteLine(e);

            }


            //catch가 개발용...테스트 할 때 포함 하면 좋지만

            //성능이 그리 좋은게 아니라

            //배포시에는 뺄수 있으면 빼는 것이 좋다.

        }

    }