2012-12-19 2 views
0

예외의 내부 예외를 catch하고 SQL Database 테이블에 기록하려고합니다. 내가 잡은 코드 및 문제없이 SQL 테이블에 예외를 기록하지만, 예외에 대한 메시지가 "세부 사항에 대한 내부 예외를 참조하십시오."라고해도 내부 예외 레코드를 얻지는 못합니다. 누군가 내면의 예외를 잡는 한 정확한 방향으로 나를 가리킬 수 있습니까? 다음은 예외를 catch하는 코드이지만 내부 예외에 대해서는 작동하지 않습니다.WCF 내부 예외를 catch하는 문제가 발생했습니다.

   try 
       { 
        context.CalculateFreight(xmldoc); 
       } 
       catch (Exception ex) 
       { 
        if (ex.Message.ToString().Length > 2048) 
        { 
         ApplicationError myError = new ApplicationError(); 
         myError.ErrorNumber = 1; 
         myError.ErrorSeverity = 1; 
         myError.ErrorState = 1; 
         myError.ErrorLine = 29; 
         myError.ErrorProcedure = "Web Service - ProcessShipping()"; 
         myError.ErrorMessage = ex.Message.ToString().Substring(0, 2047); 
         myError.ErrorDateTime = DateTime.Now; 

         context.ApplicationErrors.AddObject(myError); 
         context.SaveChanges(); 
        } 
        else 
        { 
         ApplicationError myError = new ApplicationError(); 
         myError.ErrorNumber = 1; 
         myError.ErrorSeverity = 1; 
         myError.ErrorState = 1; 
         myError.ErrorLine = 29; 
         myError.ErrorProcedure = "Web Service - ProcessShipping()"; 
         myError.ErrorMessage = ex.Message.ToString(); 
         myError.ErrorDateTime = DateTime.Now; 

         context.ApplicationErrors.AddObject(myError); 
         context.SaveChanges(); 
        } 

        if (ex.InnerException.Message.ToString().Length > 0) 
        { 
         if (ex.InnerException.Message.ToString().Length > 2048) 
         { 
          ApplicationError myInnerException = new ApplicationError(); 
          myInnerException.ErrorNumber = 1; 
          myInnerException.ErrorSeverity = 1; 
          myInnerException.ErrorState = 1; 
          myInnerException.ErrorLine = 29; 
          myInnerException.ErrorProcedure = "Web Service - INNER EXCEPTION"; 
          myInnerException.ErrorMessage = ex.InnerException.Message.ToString().Substring(0, 2047); 
          myInnerException.ErrorDateTime = DateTime.Now; 

          context.ApplicationErrors.AddObject(myInnerException); 
          context.SaveChanges(); 
         } 
         else 
         { 
          ApplicationError myInnerException = new ApplicationError(); 
          myInnerException.ErrorNumber = 1; 
          myInnerException.ErrorSeverity = 1; 
          myInnerException.ErrorState = 1; 
          myInnerException.ErrorLine = 29; 
          myInnerException.ErrorProcedure = "Web Service - INNER EXCEPTION"; 
          myInnerException.ErrorMessage = ex.InnerException.Message.ToString(); 
          myInnerException.ErrorDateTime = DateTime.Now; 

          context.ApplicationErrors.AddObject(myInnerException); 
          context.SaveChanges(); 
         } 
        } 
       } 
+1

정말 코드를 리팩터링해야합니다. 'ApplicationError' 인스턴스를 생성, 생성, 저장하는 블록은 메소드에 쉽게 포함시킬 수 있습니다. –

+0

이것은 무엇을 의미합니까? 'if (message.toString(). Length> 2048)'의심 스럽습니다. – sll

+0

@ 유일한 차이점은 메시지를 2048 자로 "서브 문자열"한다는 것입니다. 따라서 리팩터링에 대한 제 제안입니다. –

답변

1

내부 예외가없는 경우 내부 예외가 없습니다. 여기에서

는 : How to: Check an Exception's Inner Exception

에는 원래 오류가없는 경우의 InnerException의 값은 Visual Basic에서 null 참조 또는 아무것도 될 것입니다.

"자세한 내용은 내부 예외를 참조하십시오." 누군가의 상용구 본문 일 가능성이 항상 높습니다.

+0

내부 예외가없고 하나도없는 경우를 이해합니다. 그래서 로그를 남기기 전에 내부 예외의 길이를 확인하는 이유입니다. 그러나 "세부 사항에 대해서는 내부 예외를 참조하십시오"라고 생각하지 않습니다. 이 경우 상용구 메시지입니다. 어떤 이유로 서비스가 작동하지 않지만 그 서비스가 무엇인지 파악할 수 없습니다. 나는이 메시지를 매번 한 번씩 만 들지만, 나는 그 원인을 알아 내지 못했다. – RG21

+1

여전히 Null 체크가 필요합니다. 'InnerException' 속성이 먼저 null인지 확인하고, 단지'Message' 속성의 길이를 확인하지 마십시오. null 참조 예외가 발생합니다. –

+0

null로 확인하도록 변경했습니다. – RG21

관련 문제