2010-04-08 2 views
3

try catch 블록 내에서 HttpResponse.End으로 전화를 걸면 ThreadAbortException이 자동으로 다시 발생합니다. try catch 블록에서 try catch 블록을 래핑하는 경우에도이 경우라고 가정합니다.예외를 자동으로 다시 발생하는 방법

어떻게하면 동일한 작업을 수행 할 수 있습니까? 나는 이것을 위해 실제 적용이 없다.

namespace Program 
{ 
    class ReJoice 
    { 
     public void End() //This does not automatically re-raise the exception if caught. 
     { 
      throw new Exception(); 
     } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       ReJoice x = new ReJoice(); 
       x.End(); 
      } 
      catch (Exception e) {} 
     } 
    } 
} 
+0

http://blogs.msdn.com/clrteam/archive/2009/04/28/threadabortexception.aspx – AaronLS

답변

7

: 프로그램의 경우

, 당신은 같은이있을 것이다. ThreadAbortException에는 C#으로 구현할 수없는 특수한 지원이 있습니다.

ThreadAbortException은 catch 될 수있는 특별한 예외이지만 catch 블록의 끝에서 자동으로 다시 발생합니다.

+0

실제로, 'throw'하지만 실용적인 (단지 약간 수동) 해결책입니다. – Noldorin

+0

아. 나는이 줄을 다른 곳에서 보았지만 특별한 지원이 내가 흉내낼 수있는 어떤 것이라는 의미로 잘못 해석했다. – Brian

1

이렇게 하시겠습니까?

namespace Program 
{ 
    class ReJoice 
    { 
     public void End() //This does not automatically re-raise the exception if caught. 
     { 
      throw new Exception(); 
     } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       ReJoice x = new ReJoice(); 
       x.End(); 
      } 
      catch (Exception e) { 
       throw e; 
      } 
     } 
    } 
} 

편집 : "캐치"의 의미가 예외를 처리 할 수 ​​있기 때문에 그것은 예외를 다시 발생시키지 않습니다. x.End()의 호출자는 예외가 발생할 때 당신이 원하는 것을 당신에게 달려 있습니다. 예외를 포착하고 아무 것도하지 않으면 예외를 무시할 것이라고 말하고있는 것입니다. catch 블록 내에서 메시지 상자를 표시하거나 오류를 기록, 전체 응용 프로그램을 죽이고, 또는 예외를 포장하여 추가 정보 오류를 다시 발생 할 수 있습니다

throw new Exception("New message", e); 
+3

"throw e"는 예외 추적을이 줄로 제한합니다. – Gregoire

+0

@ 그렉 - 동경. 명시 적으로 생성하지 않은 예외를 throw하지 않습니다. 'catch {throw;}'가 더 적절할 것입니다. –

+0

@Greg 그러면 원한다면 그냥 던지십시오. 그는 자신의 요구 사항에 명시하지 않았습니다. 그의 요구 사항이 모호하기 때문에 나를 다운 다운하지 마라! – AaronLS

4

은 일반 throw 문을 사용하는 것만 큼 간단합니다.

throw; 

해당 catch 블록. 예외 지점에서 호출 스택을 보존하기 때문에 throw e;보다 이점이 있습니다.

물론 이것은 원하는 의미로 자동화되지는 않지만 불행히도 불가능합니다. 이것은 당신이 얻을 수있는 가장 좋은 해결책이며, 여전히 간단하다고 생각합니다. ThreadAbortException은 스레드 관리에 거의 고유하기 때문에 CLR에서 특별합니다. 이 동작을 가지고 당신은 일반 예외를 변경할 수 없습니다

namespace Program 
{ 
    class ReJoice 
    { 
     public void End() 
     { 
      throw new Exception(); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       ReJoice x = new ReJoice(); 
       x.End(); 
      } 
      catch (Exception e) 
      { 
       throw; 
      } 
     } 
    } 
} 
+1

나는 그가 ThreadAbortException과 같이 그렇게하지 않더라도 예외가 자동으로 다시 throw되도록하려고한다고 생각한다. –

+0

@Mark : 맞습니다.이 솔루션이 그가 얻을 수있는 최선이라고 생각합니다. 'ThreadAbortException'의 속성은 CLR이 스레드를 관리 할 때 본질적으로 그것을 사용하기 때문에 특별합니다. C#에서 직접 그 동작을 직접 재현 할 수는 없습니다. – Noldorin

관련 문제