programing

사용 문 안에 예외가 발생해도 Dispose가 계속 호출됩니까?

i4 2023. 5. 6. 14:02
반응형

사용 문 안에 예외가 발생해도 Dispose가 계속 호출됩니까?

아래 예제에서, 연결이 닫히고 다음 범위 내에 있는 경우 예외가 발생할 때 처리됩니까?using진술서?

using (var conn = new SqlConnection("..."))
{
    conn.Open();
    // stuff happens here and exception is thrown...
}

아래의 이 코드가 확실히 그렇게 할 것이라는 것을 알지만, 나는 명세서를 사용하는 것이 어떻게 하는지 궁금합니다.

var conn;
try
{
    conn = new SqlConnection("...");
    conn.Open();
    // stuff happens here and exception is thrown...
}
// catch it or let it bubble up
finally
{
    conn.Dispose();
}

관련:

예외가 발생했을 때 SQL 연결을 닫으려면 어떻게 해야 합니까?

네.using당신의 코드를 시도/실행 블록으로 감싼다.finally몫은 부를 것입니다.Dispose()만약 있다면,하지만 전화는 하지 않을 것입니다.Close()그것은 오직 그것을 확인하기 때문에 직접.IDisposable구현 중인 인터페이스와 그에 따라Dispose()방법.

참고 항목:

리플렉터가 코드에서 생성된 IL을 디코딩하는 방법은 다음과 같습니다.

개인 정적 void 기본(string[] 인수){SqlConnection conn = 새 SqlConnection("...");해라{커넥트열기();DoStuff();}마침내.{if (interval!= null){커넥트폐기();}}}

그래서 대답은 "예"입니다. 연결이 닫힙니다.

DoStuff()
throws an exception.

Dispose()는 이 코드에서 호출되지 않습니다.

class Program {
    static void Main(string[] args) {
        using (SomeClass sc = new SomeClass())
        {
            string str = sc.DoSomething();
            sc.BlowUp();
        }
    }
}

public class SomeClass : IDisposable {
    private System.IO.StreamWriter wtr = null;

    public SomeClass() {
        string path = System.IO.Path.GetTempFileName();
        this.wtr = new System.IO.StreamWriter(path);
        this.wtr.WriteLine("SomeClass()");
    }

    public void BlowUp() {
        this.wtr.WriteLine("BlowUp()");
        throw new Exception("An exception was thrown.");
    }

    public string DoSomething() {
        this.wtr.WriteLine("DoSomething()");
        return "Did something.";
    }

    public void Dispose() {
        this.wtr.WriteLine("Dispose()");
        this.wtr.Dispose();
    }
}

언급URL : https://stackoverflow.com/questions/518352/does-dispose-still-get-called-when-exception-is-thrown-inside-of-a-using-stateme

반응형