2009-09-22 6 views
1

나는 레거시 코드에서 이것을 보았다. 어떤 경우, 캐치 내의 단일 던지기의 목적은 무엇입니까?이 Catch 문은 무엇을 의미합니까?

원래 오류가 발견되지 않은 경우와 동일한 결과가 나타 납니까? 일반적으로 어떤 작업을 먼저 수행 한 후에 원 래 오류를 다시 던지려면 w/o 매개 변수없이 Throw 문을 사용 하시겠습니까?

답변

1

동안 중단 점을 추가하는 훨씬 쉽게 이잖아 오류를 버블 링하십시오. 이 경우 일반적으로 throw (즉, 로깅, 경고 등)하는 것보다 catch 문에 더 많은 정보를 넣는 반면 finally 문을 사용하여 정리를 수행 한 다음 오류를 다음 단계로 버블 링 할 수 있습니다. try/catch가 없으면이 정리 코드가이 범위에서 어떻게 작성됩니까? 누군가가 이미 언급했듯이 (ex가없는) throw 구문은 스택 추적을 보존합니다.

1

동일한 오류를 다시 발생시키는 것입니다. 그것은 당신이 일을 할 수 있도록 할 것 마지막으로 다시 호출

수정이 필요하지 않도록

는 분명히 예외가 캐치 다시 던져없이 거품에 오류를 던지는 동안 차단합니다. 나는 교정했다.

+0

동의.예외가 발생할 수 있지만 finally 코드를 사용하면 예외를 호출 프로세스로 전달하기 전에 트랜잭션을 닫거나 트랜잭션을 닫는 것과 같은 작업을 수행 할 수 있습니다. – Bomlin

+1

이 답변은 당신이 마침내 그것을 잡기 위해 요구된다는 것을 암시하지만, 사실이 아닙니다. :) – jsight

+0

-1 jsight가 지정한 이유 –

1

아무 것도하지 않습니다. 올바른대로 던져.

캐치를 삭제할 수 있지만 마지막에 메모 이상인 경우 시도해 보시기 바랍니다.

+0

try 블록에 있어도 예외가 발생합니까? – Gratzy

+1

예 (최소 15 자) – jsight

4

저는 디버깅 할 때 자주 패턴을 사용했습니다.을 검사 할 수 있도록 throw 문에 중단 점을 설정합니다. 비록 이것이 또 다른 좋은 이유가 있는지 확실하지 않습니다.

1

오류를 포착 한 다음 다시 throw합니다. 시도를 할 수 있기 때문에 요점을 보지 못했습니다. 마지막으로 캐치 절이 없습니다 ...

jenningj는 좋은 점이 있지만 중단 점을 사용하여 오류를 검사하는 데 사용되었을 수 있지만 프로덕션 코드에는 나타나지 않습니다.

0

매개 변수없이 throw를 사용하는 주된 이유는 원래 스택 추적을 유지한다는 것입니다.

는 대신 throw 문에 중단 점을 배치에

는 또한, 당신이 당신의 VS 설정 오라클 예외에 휴식을 변경 수, 모든 장소가 사용되는 것 같습니다

3

많은 사람들이 아무런 문제가 아니라고 생각합니다.하지만 그렇지 않습니다. 이 프로그램이있는 경우이 사실이 중요한 때 한 시나리오 :

Module Module1 
    Function Filter() As Boolean 
     Console.WriteLine("1") 
     Return True 
    End Function 

    Sub Thrower() 
     Try 
      Throw New Exception("x") 
     Finally 
      Console.WriteLine("3") 
     End Try 
    End Sub 

    Sub NoCatch() 
     Try 
      Thrower() 
     Finally 
      Console.WriteLine("2") 
     End Try 
    End Sub 

    Sub WithCatch() 
     Try 
      Thrower() 
     Catch ex As Exception 
      Throw 
     Finally 
      Console.WriteLine("2") 
     End Try 
    End Sub 

    Sub Caller(ByVal method As Action) 
     Try 
      method() 
     Catch ex As Exception When Filter() 
     End Try 
    End Sub 

    Sub Main() 
     Console.WriteLine("No Catch") 
     Caller(AddressOf NoCatch) 
     Console.WriteLine("With Catch") 
     Caller(AddressOf WithCatch) 
    End Sub 
End Module 

출력은

No Catch 
1 
3 
2 
With Catch 
3 
1 
2 

편집은 던지는와 NoCatch 기능을 thrusted 동일한 어셈블리에 있습니다. 호출자 메서드는 신뢰할 수없고 악의적이지 않습니다. 이제 Thrower 메서드가 WindowsIdentity를 사용하여 신뢰할 수없는 어셈블리에서 수행 할 수없는 다른 사용자로 가장하는 경우를 상상해보십시오. 그런 다음 사용 블록 (= try/finally)을 사용하여 사용자를 무단으로 변경하지만 예외가 발생합니다. 이는 악의적 인 어셈블리가 Filter 메서드를 실행하는 동안 가장 된 사용자로 실행됨을 의미합니다. 아마 이것은 권한을 주장하는 경우에도 작동하지만 확실하지 않습니다.

+0

흥미 롭습니다. 마침내 절을 부르는 순서는 어떤 경우에 중요합니까? –

+0

콘솔에 번호 1, 3, 2를 순서대로 쓰고 위의 코드로 해결하려고하는 유일한 사양을 가진 프로그램이 있다면 분명히 중요합니다 :) – erikkallen

+0

주목할만한 또 다른 흥미로운 점은 필터 경우에 따라 예외를 기록하도록 허용 할 수 있습니다. 결국 예외가 잡히지 않고 덮어 쓰게됩니다. 'P1' [in vb.net]은'try/catch MooException' 블록 내에서'P3'를 호출하는'ZooException Catch ZooException When ZooFilter()'에서'P2'를 호출합니다. 'P3'는'finally/finally' 절이'MooException'을 던집니다'try/finally' 블록에서'P4'를 호출하고'P4'는'ZooException'을 throw합니다. 'P1'의 필터가'ZooException'을보고 그것을 잡기로 결정했다 할지라도, 예외가 사라질 수 있습니다. – supercat