2009-04-15 2 views
6

다음과 같습니다 코드에 대한 당신의 생각은 무엇입니까 :생각은

public void doSomething() 
{ 
    try 
    { 
     // actual code goes here 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
} 

나는 실제 오류가 단지 다른 위치에 예외를 던지는 처리되지 않는 것을 볼 문제. 나는 실제 문제가있는 라인 번호를 얻지 못하기 때문에 디버깅하기가 더 어렵다.

내 질문에 왜 이것이 좋을까요? 그것은 대부분의 사람들처럼 보이는 답변에서

---- 편집 ----

는 어떤 사용자 또는 특정 예외가 적발되고 있지 함께이 일을 무의미 말하고있다. 그것은 특별한 예외가 잡히지 않을 때, 내가 코멘트를 원했던 것이다. 실제로이 코드가 아닌 방식으로 예외가 잡히는 지점을 실제로 볼 수 있습니다.

답변

15

보고있는 품질에 따라 예외를 다른 장소에 던지지는 않습니다. 타겟이없는 "throw"는 예외를 던지기와 매우 다른 예외를 rethrow합니다. 주로 rethrow는 스택 추적을 재설정하지 않습니다.

이 샘플에서는 캐치가 아무 것도하지 않기 때문에 무의미합니다. 예외는 행복하게 재 해석되며 마치 try/catch가 존재하지 않는 것과 같습니다.

+0

Scott Hanselman에 의해 내가 전에 같은 코드를 본 적이있다. 일반적으로 디버깅 중에 삽입되므로 누군가가 'throw'에 중단 점을 넣을 수 있습니다. –

+0

@Joel, gotcha. 더 좋은 해결책은 던지기를 깨기 위해 VS를 사용할 수 있습니다. 하지만 그것은 거의 정교하지 않습니다. ( – JaredPar

+0

브레이크 포인트에 대한 장점은 유닛 테스팅 중에 중요하지 않은 오류의 세부 사항을 기록 할 수 있다는 것입니다. 이는 매우 유용합니다! –

0

제네릭 예외가 이처럼 catch 된 다음 사용자 지정 Exception 개체에 다시 채워진 인스턴스를 보았습니다.

당신이 말하는 것과 다른 점은 이러한 사용자 정의 Exception 객체가 실제로 발생한 예외에 대한 정보를 더 많이 보유한다는 것입니다.

3

나는 당신이 당신의 코드 안에 던질 것이라는 것을 알고있는 예외를 처리하기 위해 사용되어야한다고 생각한다; 다른 예외가 발생하면 그냥 다시 시도하십시오.

throw; 은 과 다릅니다.

예외를 던지면 예외에 대한 중요한 정보가 손실되어 새로운 스택 지점으로 스택이 잘립니다. 우선 잘

public void doSomething() 
{ 
    try 
    { 
     // actual code goes here 
    } 
    catch (EspecificException ex) 
    { 
     HandleException(ex); 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
} 
+1

예에서 catch (Exception ex)는 필요하지 않습니다. Exception을 처리하지 않으면 동일한 효과가 나타납니다. –

0

는 단순히

catch 
{ 
    throw; 
} 

을 할 거라고하지만 예외의 여러 유형을 트래핑 한 기본적으로 경우 로컬 일부를 처리 할 수 ​​있으며, 다른 사람들이 스택을 백업 할 수 있습니다.

그런 일을하는

catch(SQLException sex) //haha 
{ 
    DoStuff(sex); 
} 
catch 
{ 
    throw; 
} 
1

은 매우 의미이며, 일반적으로 나는 의미없는 일을의 길을 가야하지 않으려 고,

대부분의 경우

, 나는 예외의 특정 유형을 잡기 믿고) 그 당신은 더 많은 정보를 가지고 당신 자신의 예외를 만들고 InnerException처럼 캐치 된 예외를 사용하는 것을 의미한다고 할지라도 처리하는 방법을 알고 있습니다.

0

"다음과 같이 보입니다"라는 의미에 따라 다르고 catch 블록에 아무 것도없는 경우 다시 로그인하십시오.그렇다면 try catch는 아무런 의미가 없는데 예외는 예외가 발생한 곳을 난독 화하는 것입니다. 그러나 오류가 발생한 곳에서 바로 작업을 수행해야하지만 예외를 처리하려는 경우 스택이 적절할 수 있습니다. 그러나, 캐치는 HANDL있는 특정 예외가 될 것이다되지 않은 예외에 대한 보내고

3

그것은 이상적으로 catch 블록은 예를 들어, 어떤 처리를 수행 한 후 다시 던지는 것,되지 않을 것

try 
{ 
    //do something 
} 
catch (Exception ex) 
{ 
    DoSomething(ex); //handle the exception 
    throw; 
} 

물론 코드의 상위 계층에서 추가 처리를 수행하려는 경우 리 스로우가 유용합니다.

1

경우에 따라 호출 스택에서 상위 예외를 처리 할 때 적합합니다. 그러나 catch 블록에서 무언가를 할 필요가있을 것입니다. 오류를 기록하십시오 :

public void doSomething() 
{ 
    try 
    { 
     // actual code goes here 
    } 
    catch (Exception ex) 
    { 
     LogException (ex); // Log error... 
     throw; 
    } 
} 
0

나는 오류를 재실행하는 것이 유용 할 것이라고 생각하지 않습니다. 처음에 오류에 대해 정말로 신경 쓰지 않는다면 말입니다.

실제로 잡기에서 뭔가를하는 것이 더 좋을 것이라고 생각합니다.

MSDN Exception Handling Guide을 확인할 수 있습니다.

관련 문제