문제

요즘 IDisposable을 구현하는 개체가 있을 때 using 블록을 점점 더 많이 활용하려고 노력하고 있지만 알아내지 못한 한 가지는 일반적인 try/catch/finally에서처럼 예외를 잡는 방법입니다.올바른 방향을 알려주는 코드 샘플이 있나요?

편집하다:답변을 읽어본 후 질문이 수정되었습니다.".NET 2.0과 함께 사용 블록에서 예외를 던지는 방법"이었다. 그러나 나는 실제로 사용 블록 내에서 이러한 예외를 포착 할 수있는 방법을 찾고있었습니다.


using 블록 내부에서 자체 잡기 블록을 굴리는 방법에 대한 자세한 내용을 찾고 있습니다.

편집하다:내가 피하고 싶었던 것은 @Blair가 보여준 것처럼 내 using 블록 내에서 try/catch/finally를 사용해야 한다는 것입니다.하지만 아마도 이것은 문제가 아닐 수도 있습니다 ...

편집하다:@Blair님, 제가 찾던 내용이 바로 이것입니다. 자세한 답변 감사드립니다!

도움이 되었습니까?

해결책

나는 질문을 정말로 이해하지 못합니다. 평소처럼 예외를 던집니다.만약에 MyThing 구현하다 IDisposable, 그 다음에:

using ( MyThing thing = new MyThing() )
{
    ...
    throw new ApplicationException("oops");
}

그리고 thing.Dispose 예외가 발생하면 블록을 떠날 때 호출됩니다.try/catch/finally와 using을 결합하려면 다음 중 하나를 중첩하면 됩니다.

try
{
    ...
    using ( MyThing thing = new MyThing() )
    {
        ...
    }
    ...
}
catch ( Exception e )
{
    ....
}
finally
{
    ....
}    

(또는 try/catch/finally를 사용에 넣습니다):

using ( MyThing thing = new MyThing() )
{
    ...
    try
    {
        ...
    }
    catch ( Exception e )
    {
        ....
    }
    finally
    {
        ....
    }    
    ...
} // thing.Dispose is called now

아니면 using 명시적으로 호출 Dispose 에서 finally @Quarrelsome이 설명한 대로 블록을 차단하고 필요한 추가 예외 처리 또는 복구 코드를 추가합니다. finally (또는 catch).

편집하다:@Toran Billups에 대한 응답으로, Dispose 메서드가 호출되면 다음 중 하나를 사용해야 합니다. using 그리고 try/catch/finally 또는 using - 원하는 바를 이룰 수 있는 다른 방법은 없다고 생각합니다.

다른 팁

예, 블록을 사용할 때 예외를 발생시키는 것과 다른 점은 없습니다.using 블록은 기본적으로 다음과 같이 변환됩니다.

IDisposable disposable = null;
try
{
    disposable = new WhateverYouWantedToMake();
}
finally
{
    disposable.Dispose()
}

따라서 무엇이든 잡으려면 잡기를 직접 굴려야 하지만 잡기/던지기는 사용과는 완전히 별개의 문제입니다.finally는 실행이 거의 보장됩니다(캐치할 수 없는 예외를 저장하세요(예:스택오버플로 또는 메모리 부족) 또는 누군가가 PC에서 전원을 빼내는 경우).

예외를 포착하려면 try 문이 필요합니다.

using 블록 내에서 try 문을 사용하거나 try 블록에서 using 블록을 사용할 수 있습니다.

하지만 발생하는 예외를 포착하려면 try 블록을 사용해야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top