C#try catch 예외 캡처 문의 주의사항

1613 단어 C#학습 노트
어떤 함수를 호출할 때trycatch문구를 사용하여 이 함수에 발생한 이상을 포착하고 이 함수에서 다른 함수를 호출하면 다른 함수는 또 다른 함수를 떨어뜨린다. 만약에 이 호출된 함수 중 임의로 이상을 던지면 이상이 있는 코드 블록에 이상 포획 작업이 없기 때문에 이 이상은 가장 바깥쪽의trycatch문구에 포착된다.이때 발생하는 이상은 처음에 예상했던 것보다 훨씬 높다. 지정한 오류 알림을 출력한 후에 오류를 찾아와서 그 이상이 어느 코드에서 던져졌는지 찾기 어렵다.예컨대 아래 코드
class Program
    {
        static void Main(string[] args)
        {
            try { Fun_1(); }
            catch { Console.WriteLine("   ???"); }

            Console.ReadKey();
        }

        static void Fun_1()
        {
            Fun_2();
        }

        static void Fun_2()
        {
            Fun_3();
        }

        static void Fun_3()
        {
            Fun_4();
        }

        static void Fun_4()
        {
            Fun_5();
        }

        static void Fun_5()
        {
            throw new Exception("Fun_5     !");
        }

이 코드에서 주 함수 호출Fun1,Fun_1 Fun 호출2Fun 까지 이러한 방식으로 밀어냄5 이상을 던지는데 이 코드에main 함수에만 이상을 포획하는 논리가 적혀 있기 때문에Fun5의 예외가main 함수에서Fun 호출됨1의 장소를 포획하고 처리합니다. 만약에 전체 공정의 코드량이 비교적 많으면 이 이상은 디버깅을 오래 해야 찾을 수 있습니다!
그래서 결론은try catch 문구를 사용하여 이상을 포착하려면 모든 이상을 던질 수 있을 때 이상을 포착해야 BUG를 찾는 시간을 최대한 줄일 수 있다는 것이다!
(2016년 9월 9일 수정:) 오늘 Exception 클래스를 사용하여 오류 정보를 받아들일 수 있음을 발견했다. 예를 들어 상기 코드의 주함수를 이렇게 바꾸었다.
static void Main(string[] args)
        {
            try { Fun_1(); }
            catch (Exception ex){ Console.WriteLine("   ???    " + ex.Message); }

            Console.ReadKey();
        }

이렇게 하면 정확한 오류 정보를 얻을 수 있어 오류의 위치를 더욱 빨리 찾을 수 있지만 가능한 한 완전한 이상 포획 논리를 해야만 이상이 발생할 때 가장 먼저 이상 코드를 추적할 수 있다.

좋은 웹페이지 즐겨찾기