NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 32-2. C#의 예외 처리와 던지기. (Exception handling and throw)

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 오늘은 삼일절입니다. 나라의 주권을 되찾고자 목숨을 바치신 순국선열에 대한 추모와 애도의 묵념을 올리면서 과거를 반면교사 삼아 다시는 이런일이 일어나지 않도록 해야겠습니다. 그리고, 재미 있게 읽을만한 글을 하나 링크합니다. 여러가지 생각할 것들이 있으니 가볍게 한번 읽어보세요^^;

    "설은 축제, 놀아야... 혼밥하지 마라" - 황교익 인터뷰 ]

    IoFGSmk.jpg

     

     

    오늘은 C# 예외 처리의 나머지 이야기들을 해보도록 하겠습니다. 메소드 하나하나 맴버까지 알아보려면 엄청나게 많은 내용을 적어야 하기에 핵심적인 내용에 대해서만 알아보고 있는데요. 사실 비주얼 스튜디오의 인텔리센스만 자세히 읽어봐도 대부분의 문제에 대해 해결할 수 있을겁니다. 기능에 대한 설명보다는 왜 사용해야 하는지, 경우에 따라 어떤걸 사용해야 하는지 아는게 더 중요합니다. 물론, 이런 기능이 있다는 것을 먼저 알아야겠죠? 그렇기에 반드시 A~Z까지 설명되어 있는 바이블을 한번은 꼭 정독해야 합니다.

     

    C#은 Java와 다르게 catch에 특정 예외 객체를 명시하지 않은 Empty catch를 사용할 수 있습니다. 하지만, Empty catch는 저번 시간에 알아본 다중 catch로 사용할 수 없습니다. 또한 Empty catch가 있다면 Exception 객체를 지정한 catch도 사용이 안됩니다.

    Program.cs

    using System;
    
    namespace TryCatch
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] arr = { 1, 2, 3 };
                try
                { for (int i = 0; i < 10; i++) { Console.WriteLine(arr[i]); } }
                catch { Console.WriteLine("예외가 발생했습니다."); }
                Console.WriteLine("종료하려면 아무키나 누르세요.");
                Console.ReadKey();
            }
        }
    }
    

     

     

    위 코드는 실제 현업에서 사용되지 않습니다. 정확한 에러 상황을 알 수 없기 때문인데요. 위와 같은 예외를 만들면 이 예외가 발생하게 된 에러 상황을 정확하게 알 수 없기 때문입니다. 따라서, Empty catch보다는 Exception 객체를 사용해서 catch해야 합니다.

    Exception throw (예외 던지기)는 이미 위의 코드에서 확인한 내용입니다. 우리가 try~catch에서 어떤 예외 객체를 받았기 때문입니다. 그렇다면 누군가가 우리에게 예외를 던져준걸까요? .NET Framework입니다. 이미 수많은 예외들이 만들어져 있고, 우리가 catch하고자 하면 객체가 우리에게 던져주게 됩니다. 우리도 어떤 객체를 디자인하고 다른 개발자가 사용할 수 있도록 할 때 예외를 던져줄 수 있습니다. 이 때 사용하는 키워드가 throw입니다.

    Program.cs

    using System;
    
    namespace TryCatch
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                { var c = new Car(); Console.WriteLine(c.Accel); Console.WriteLine(c.Break); }
                catch (Exception e) { Console.WriteLine(e.Message); }
                Console.WriteLine("종료하려면 아무키나 누르세요.");
                Console.ReadKey();
            }
        }
        public class Car
        {
            private bool isAccel = false;
            private bool isBreak = false;
            public string Accel { get { isAccel = true; ErrorCheck(); return "엑셀을 밟고 있습니다."; } }
            public string Break { get { isBreak = true; ErrorCheck(); return "브레이크를 밟고 있습니다."; } }
     
            private void ErrorCheck()
            {
                if (isAccel && isBreak)
                    throw new Exception("엑셀과 브레이크는 동시에 조작할 수 없습니다.");
            }
        }
    }
    

     

     

    위 코드는 아주 간단한 예제입니다. 자동차 객체를 하나 만들고 Accel과 Break를 조작할 수 있는 속성을 추가했죠. 그리고, Accel과 Break는 동시에 조작할 수 없기 때문에 ErrorCheck() 메소드를 추가해서 예외를 던질 수 있도록 처리했습니다.

    이 객체를 사용하는 Program은 try~catch를 통해 Car 개체가 던지는 예외를 받아볼 수 있고, 정확하게 어떤 문제가 발생되어 프로그램이 종료되는지 알 수 있게 됩니다. 기존에 C++은 아무 개체나 받았지만, C#은 Exception 객체만들 받을 수 있습니다. 그렇기 때문에 예외를 던질 때는 꼭 Exception 개체만 throw해야만 합니다.

     

    예외를 받아서 다시 상위 개체에 던질수도 있습니다. 이 내용은 정리해 놓은게 있어서 링크로 대신하도록 하겠습니다^^;

    13. Java vs C# (Exception process, 예외 처리) ]

     

     

    다음 시간에...

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.