문제

이 글에 쓰여진 내용을 토대로 웹 페이지, 그리고 내가 올바르게 이해했다면, using 명령문은 다음과 같이 작동합니다. try/finally, 따라서 예외가 발생하면 using 명령문을 사용하면 프로그램이 중단되어서는 안 됩니다.

그러나, DownloadString 아래 예에 표시된 메서드는 WebException, 프로그램이 충돌합니다.

using (WebClient client = new WebClient())
{
    string response = client.DownloadString(url);
    // ...
}

이는 정상적인 현상입니다. using 진술은 다음과 같이 작동하지 않습니다 try/catch/finally, 이면 실제로는 예외가 처리되지 않습니다.그런데 그 목적이 무엇인지 궁금합니다. using 성명.

업데이트... 아래 답변을 바탕으로 다음 고려 사항을 추가합니다.기본적으로 예외를 처리해야 하는 경우 가능한 해결 방법은 다음과 같습니다.

  1. 넣어 using 안에 있는 진술 try/catch 차단하다.
  2. 만 넣어 DonwloadString 내부 메소드 try/catch 차단하다.
  3. 다음 코드 샘플과 같이 try/catch/finally 블록을 수동으로 작성합니다.

세 번째 솔루션의 샘플 코드입니다.

WebClient client = new WebClient();
try
{
    string response = client.DownloadString(url);
    // ...
}
catch(Exception ex)
{
    // handle (or ignore) the exception
}
finally
{
    if (client != null)
        client.Dispose();
}
도움이 되었습니까?

해결책

내가 올바르게 이해했다면 using 문은 try/finally처럼 작동합니다.

옳은.

따라서 using 문에서 예외가 발생하더라도 프로그램이 중단되지 않을 것으로 예상합니다.

잘못된.

어느 것도 아니다 try/finally ...도 아니다 using 명령문은 예외를 삼킨다. 예외를 포착하지 못하면 예외가 전파될 것이다.잡히지 않으면 일반적으로 프로세스가 종료됩니다.(어떤 스레드에 있고 CLR이 어떻게 구성되어 있는지에 따라 그렇지 않은 경우가 몇 가지 있지만 이는 다른 문제입니다.)

그런데 using 문의 목적이 무엇인지 궁금합니다.

리소스를 폐기해야 하는 코드를 더 간단하게 작성하기 위해.그게 다야.우리가 없었다면 using 진술, 우리는 많은 ~의 try/finally 방금 호출한 블록 Dispose...그리고 그것은 상당히 추악할 것입니다.(저희도 그랬습니다. Java 7에서 try-with-resources 문이 도입되기 전까지는 Java였습니다.)

다른 팁

using 명령문이 모든 예외를 마술처럼 사라지게 하는 것은 아닙니다. 단지 IDisposable.Dispose 메소드가 올바르게 호출되었습니다. client 발생하는 경우 이의를 제기합니다.이는 관리되지 않는 리소스가 해제되었는지 확인하는 데 중요합니다.

발생한 모든 예외가 다시 발생하며 여전히 사용자 코드에서 예외를 처리해야 합니다.

MSDN 설명을 참조하세요. using 성명

즉, 를 사용하면 다음이 보장됩니다. .Dispose() 예외가 발생하더라도 호출됩니다.그러나 예외가 해당 작업을 수행하는 것을 막지는 않습니다.

using 문에는 catch가 없으며 finally만 있으므로 리소스를 처리합니다.using 문이 모든 예외를 포착하고 계속 실행된다면 디버깅에 큰 방해가 될 것입니다.

사용하고 읽는 것이 더 쉽고 빠릅니다.

직접 확인해보세요

var myVar = null
try
{
    my = new Object();
    //Do stuff
}
finally
{
    if(myVar != null)
        myVar.Dispose()
}

using(var myVar = new Object())
{
    //Do stuff
}

단순히 폐기하다 해당 개체에 대해 호출됩니다.그만큼 사용하여 try/finally도 마찬가지이므로 예외 처리를 수행하지 마세요.

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