2009-09-03 8 views
3

예외 처리 후 정리를 시도하고 StreamWriter를 처리하는 방법을 잘 모르겠습니다.예외가 발생하는 동안 StreamWriter를 정리하는 방법은 무엇입니까?

Dim sw As StreamWriter 

Try 
    ''// stuff happens 

    somethingBad1() ''//Sometimes throws an exception 

    sw = New StreamWriter(File.Open("c:\tmp.txt", FileMode.Create)) 

    ''// stuff happens 

    somethingBad2() ''//Also sometimes throws an exception 

    sw.Write("Hello World") 
    sw.Flush() ''//Flush buffer 
    sw.Close() ''//Close Stream 

Catch ex As Exception 
    sw = Nothing  
Finally 
    sw = Nothing  
end try 
somethingBad1가 예외를 던진다면, 나는 sw에 아무것도 할 필요가 없습니다

; 그러나 somathignBad2가 발생하면 sw이 이미 생성되었으며이를 닫아야합니다. 그러나 sw이 생성되었는지 여부를 어떻게 알 수 있습니까?

+3

그런데 'Catch'와'Finally' 블록은 의미가 없습니다. 변수를'Nothing'으로 설정하면'sw'이 지역 변수 인 경우 실제로 아무런 도움이되지 않습니다 (특히' t "도움"GC). 또한, 'Finally'는 블록이 예외없이 떠나는 지 여부에 관계없이 실행되므로'Catch '에 중복 기능이 필요하지 않습니다. –

답변

9
''//stuff happens but you don't care because you didn't instantiate 
''//    StreamWriter yet 
somethingBad1() ''//Sometimes throws an exception 

Using sw As New StreamWriter("test.dat") 
    ''// stuff happens 
    somethingBad2() ''//Also sometimes throws an exception 
    ''//as you are in a using statement the sw.Dispose method would be called 
    ''//which would free the file handle properly 
    sw.Write("Hello World") 
End Using 
2

만 (샘플 단위) sw 변수를 할당 한 후 try을한다. 또는 using 문을 사용하십시오.

그러나 일반적으로 StreamWriter를 사용하지 않을 경우 (using) Nothing을 지정하지 말고 닫아야합니다. 또한 모든 예외를 포착하는 것은 피해야하며 정상적으로 처리하는 방법을 알고있는 예외 만 처리해야합니다.

1

Darin이 맞습니다.하지만 Pavel Minaev의 의견을 확장하는 한 가지 스타일에 대한 지적이 있습니다. VB6과 달리 VB.Net에서는를 사용할 수 없습니다. Nothing은 실제 효과가 없습니다. 당신은 정말로 그것을 할 필요가 없습니다.

Finally 
    ''# test 
    If sw IsNot Nothing Then sw.Dispose() 
End 

그리고 (당신이 catch 블록의 쇼를했습니다 것을 포함) 모든 필요한 정리의 걸릴 것주의 : 당신이 할 수있는 당신의 마지막 블록에 같은 코드를 가지고있다. 주 코드에서 스트림을 닫을 필요조차 없습니다. 그러나 일반적으로 Using 블록이이를 처리하는 더 좋은 방법입니다.

+0

저는 (+1)을 찾고 있었는데, "Using"블록이 더 좋은 방법이라고 생각합니다. btw., " '"// ""VB 주석 대신 일반 "'"대신 백그라운드 스토리가 무엇입니까? S.O.가 있었습니까? 내가 놓친 표준? – BIBD

+0

내장 된 구문 형광펜은 VB에서 '문자에 질식합니다. 그것은 문자열 리터럴의 시작이라고 생각합니다. 줄의 끝에 다른 '문자를 넣을 수도 있지만, 주석이 아닌 문자열 리터럴처럼 채색되어 있으며 주석의 다른 문자도 이스케이프 처리해야합니다. ''//를 사용하면 줄에 포함될 수있는 다른 문자와 상관없이 줄을 올바르게 주석 처리합니다. –

+0

방금 ​​발견 한 (그리고 위에서 볼 수 있듯이) "#"을 사용하여 한 문자를 저장하고 C 스타일 주석처럼 보이지 않게 할 수 있습니다. 사실, 여기부터 사용하겠습니다. –

관련 문제