2013-08-20 7 views
2

이 다음은 C#에서 내 코드 수정 한 후에는 예외를 던지는 :는 사전

catch(Exception ex) 
{ 
    ex.Data.Add("VarName", "object"); 
    throw; 
} 

질문 : 위하고, 내가 데이터 사전에 추가하고 항목을 잃게 될입니까? -> 내 생각에, catch 문에서 발견 된 예외를 다시 던지고, 다음 줄의 Dictionary 레코드가 아직 추가되지 않았습니다.

은 위의 코드 대신해야합니다

catch(Exception ex) 
{ 
    ex.Data.Add("VarName", "object"); 
    throw ex; 
} 
  • 하지만이 경우

    , 나는 스택 추적을 재설정하지 않습니다.

이 검색 결과는 웹 및 SO에서 찾아 볼 수 있지만 행운은 없습니다.

TIA!

+1

일부 데이터를 예외에 추가하려면 데이터로보다 구체적인 예외의 랩을 수행하고 해당 예외를 throw하십시오. –

+0

시도해 보셨습니까? 몇 가지 샘플 코드를 작성하는 데 몇 분이 걸리지 않습니다. –

+0

방금 ​​시도 - 바트의 대답은 정확합니다. 내 초기 코드는 정상적으로 작동합니다. – coder0h1t

답변

3

초기 코드는 정상적으로 작동합니다. 사전 항목을 잃어서는 안됩니다.

[편집] : 정교화.

은의 다음 예제 코드를 보자 :

using System; 
class Program 
{ 
    static void Main() 
    { 
     Change(); 
     Replace(); 
     Inner(); 
    } 

    static void Change() 
    { 
     try { 
      try { 
       throw new Exception("This is a message"); 
      } catch (Exception e) { 
       e.Data.Add("foo", "bar"); 
       throw; 
      } 
     } catch (Exception e) { 
      System.Diagnostics.Trace.WriteLine(e.Message); 
      System.Diagnostics.Trace.WriteLine(e.Data["foo"]); 
     } 
    } 

    static void Replace() 
    { 
     try { 
      try { 
       throw new Exception("This is a message"); 
      } catch (Exception e) { 
       e = new Exception("Different message", e); 
       e.Data.Add("foo", "bar"); 
       throw; 
      } 
     } catch (Exception e) { 
      System.Diagnostics.Trace.WriteLine(e.Message); 
      System.Diagnostics.Trace.WriteLine(e.Data["foo"]); 
     } 
    } 

    static void Inner() 
    { 
     try { 
      try { 
       throw new Exception("This is a message"); 
      } catch (Exception e) { 
       e.Data.Add("foo1", "bar1"); 
       e = new Exception("Different message", e); 
       e.Data.Add("foo2", "bar2"); 
       throw e; 
      } 
     } catch (Exception e) { 
      System.Diagnostics.Trace.WriteLine(e.Message); 
      System.Diagnostics.Trace.WriteLine(e.Data["foo2"]); 
      System.Diagnostics.Trace.WriteLine(e.InnerException.Message); 
      System.Diagnostics.Trace.WriteLine(e.InnerException.Data["foo1"]); 
     } 
    } 
} 

Exception를 던지고, 정말로 슬로우되는 것은 예외 객체에 대한 참조입니다. 그 참조는 잡히고 다시 태어난 것입니다. 기본 객체를 수정하는 것이 좋습니다. 이것은 귀하의 초기 코드가하는 것과 내 예제에서 수행하는 Change 메소드입니다.

Replace 메서드에서 우리는 객체가 아니라 참조 자체를 수정합니다. 우리는 새로운 메시지를 가진 새로운 Exception 객체를 가리키게하고, 그 위에 또 다른 데이터를 추가합니다. 인수없이 throw이 원래 참조를 다시 전하기 때문에이 모든 것들이 손실됩니다.

두 번째 사례를 사용해야하는 경우 Inner 메서드에서와 마찬가지로 원래 예외를 InnerException으로 포함하여 스택 추적을 추적 할 수 있습니다.

+0

나는 직장에서이 대답을 돌진했다. 설명을 추가했습니다. –