2014-02-13 2 views
6

누구나 throwthrow ex의 차이점을 간단히 말해 줄 수 있습니까? throw은 이전 예외를 저장하지만이 줄은 가져 오지 않습니다.
예를 들어 간단히 알 수 있습니까?던전과 던지기의 차이점은 C# .net

+3

http://stackoverflow.com/questions/730250/is-there-a-difference-between, 던져, 또는 새로운 예외를 만들고 해당 던져해야 -throw-and-throw-ex – Random

+0

'throw', 매개 변수없이'catch' 블록에서'catch '를 야기한 예외를 다시 발생시킵니다. – Jodrell

답변

21

예 - throw은 catch 된 예외를 다시 throw하고 스택 추적을 보존합니다. throw ex은 동일한 예외를 throw하지만 은 스택 추적을 해당 메서드로 다시 설정합니다. 당신은 스택 추적을 다시 원하는 하지 않는 한

은 예외가 발생한 위치를 볼 수 있기 때문에 throw일반적으로 더 나은 선택이다, (즉 라이브러리의 내부 작업에서 공공 발신자를 보호하기 위해).

는 또한 그는 "통과"catch 블록을 언급합니다 :

try 
{ 
    // do stuff 
} 
catch(Exception ex) 
{ 
    throw; 
} 

무의미하다. try/catch이 전혀없는 것과 똑같은 동작입니다.

+3

던지기 전에 로그 문을 넣으면 무의미합니다. 어떻게 내가 그것을 아주 자주 사용하는지. – Evgeni

+15

@Eugene 당신은 맞습니다.하지만 나는 던지기 전에 아무것도 가지고 있지 않습니다. 그것은 내가 설명하려고했던 것입니다. –

4

던지기는 원래의 예외를 다시 제기합니다.

throw ex는 새로운 예외를 생성하므로 스택 추적이 변경됩니다. 일반적으로 거의 의미가 일반적으로 당신도 방금 예를 들어

// not a great code, demo purposes only 
try{ 
File.Read("blah"); 
} 
catch(FileNotFoundException ex){ 
throw new ConfigFileNotFoundException("Oops", ex); 
} 
+0

나는 한 번 이상이 패턴을 사용했다. 보통 새로운 코드를 던져 넣은 것이다. 내가 업스트림 * 코드를 변경할 시간/액세스/권한을 가지고 있다면 이것을 필요로하지 않기 위해 리팩토링을 시도 할 것이다. 그러나, 나는 그린 필드 코드에서이 패턴을 사용하기도합니다. –

관련 문제