using 문의 목적은 무엇입니까?
-
24-12-2019 - |
문제
이 글에 쓰여진 내용을 토대로 웹 페이지, 그리고 내가 올바르게 이해했다면, using
명령문은 다음과 같이 작동합니다. try/finally
, 따라서 예외가 발생하면 using
명령문을 사용하면 프로그램이 중단되어서는 안 됩니다.
그러나, DownloadString
아래 예에 표시된 메서드는 WebException
, 프로그램이 충돌합니다.
using (WebClient client = new WebClient())
{
string response = client.DownloadString(url);
// ...
}
이는 정상적인 현상입니다. using
진술은 다음과 같이 작동하지 않습니다 try/catch/finally
, 이면 실제로는 예외가 처리되지 않습니다.그런데 그 목적이 무엇인지 궁금합니다. using
성명.
업데이트... 아래 답변을 바탕으로 다음 고려 사항을 추가합니다.기본적으로 예외를 처리해야 하는 경우 가능한 해결 방법은 다음과 같습니다.
- 넣어
using
안에 있는 진술try/catch
차단하다. - 만 넣어
DonwloadString
내부 메소드try/catch
차단하다. - 다음 코드 샘플과 같이 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
발생하는 경우 이의를 제기합니다.이는 관리되지 않는 리소스가 해제되었는지 확인하는 데 중요합니다.
발생한 모든 예외가 다시 발생하며 여전히 사용자 코드에서 예외를 처리해야 합니다.
즉, 를 사용하면 다음이 보장됩니다. .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도 마찬가지이므로 예외 처리를 수행하지 마세요.