2011-04-12 3 views
2

파일을 추상화하고 포함 된 스트림에 IDisposable을 구현하는 유형에 대해이 구현을 작성했습니다. 내가 Exception 으로 아무것도하지 않고있어 Exception 스트림 용 일반 IDisposable 래퍼 - 모든 예외를 포착하는 대신

  • 를 잡는거야

    • : 때문에,

      public void Dispose() 
      { 
          if (_contentStream == null) 
          return; 
          lock (_contentStreamLocker) 
          { 
          if (_contentStream == null) 
           return; 
      
          try 
          { 
           _contentStream.Dispose(); 
          } 
          catch (Exception) 
          { 
           //legitimate? - don't let any exception prevent 
           //us from successfully disposing? 
          } 
          _contentStream = null; 
          } 
      } 
      

      그래서 내가 분명히 더러운 느낌 : 모든 프로젝트에 사용하기위한 것입니다

      하지만 기본 스트림의 동작을 보장 할 수 없으므로 (사용자 지정 구현도 고려해야 함) - 즉 이미 처리되었거나 상태가 wher 인 경우 구현은 폐기가 불가능하다고 결정합니다. - 나는 무엇을 해야할지 실제로 볼 수 없습니다.

      분명히 나쁜 구현을 숨기면 안된다. StreamDispose(); 하지만 여기에는 반쪽 집이 있다고 생각합니다.

      특히이 개체가 반드시 스트림을 소유하고 있지 않으므로 항상 Dispose()을 담당 할 필요는 없습니다. 따라서 스트림이 다른 사람에 의해 처분되었을 때 관용적이어야합니다.

      분명히, 대부분의 경우 이것은 문제가되지 않습니다. using 블록에있는 파일을 가져 와서 읽은 다음 그 파일과 함께 처리 한 다음 처리하십시오. 그러나 그 최후의 경우가 있습니다. 그들은 나를 괴롭힌다!

      처음에는이 코드를 catch(ObjectDisposedException){ }으로 작성했지만, 이는 비공식적 인 패턴 일뿐입니다.

      어떻게해야합니까? 예외적 인 꿀꺽 꿀꺽 마술은 나쁜 카르마라는 사실에도 불구하고 이것을 그대로 유지 하시겠습니까? Gulp ObjectDisposedException 그래도 그렇게 좋지는 않습니까? 또는 나는 꿀꺽 꿀꺽 마시거나 전혀 취급하지 않는 예외를 가져야합니까?

      모든 경우에서 장점을 볼 수 있습니다. 그 중 어떤 것이 승리하는지 파악할 수 없습니다.

  • +0

    스트림이 수업에 비공개 인 경우 무엇을 처리 했습니까? 스트림이 공개적으로 노출되어 있습니까? – Jodrell

    +0

    @ Jodrell - 아 질문 - 스트림을 개체로 설정할 수 있습니다. 클래스는 호출자가 파일 객체를 채우고 서비스에 제공하고 서비스에서 파일과 스트림을 동등하게 검색 할 수 있도록 get/set 인터페이스를 구현합니다. 환경은 많이 추상화되어 있습니다. –

    답변

    3

    일반적으로 어떤 것이 승리하는지 파악할 수 없다면 "일반적으로"처리 할 수없는 유용한 정보가 있기 때문입니다. 이 경우 호출자가 처리하도록하는 것이 바람직하다고 생각합니다. 왜냐하면 호출자가 더 나은 판단을 할 수있는 구체적인 상황에 있기 때문입니다.

    스트림이이 클래스에 어떻게 도입 되었습니까? 엔지니어를 전달할 수 있다면 호출자가 처분을 처리하도록하고 자신에게 신경 쓰지 마세요. 항상 StreamReader이이 책임을 맡고 있다는 사실이 궁금합니다. 그렇지 않든 상관하지 않겠습니다.

    예외는 특히 외부 소비를위한 코드에서는 예외가 아닙니다.

    +0

    개체 폐기 예외를 삼켜 서 예외를 마무리해도 좋습니다. – Aliostad

    +1

    번역 : "자동으로 리소스가 누출 될 수 있고 후속 작업을 중단 할 수 있습니다." –

    2

    당신이 말한대로, 당신은 일회용을 소유하지 않는 경우에,를 처분하면 안된다. Dispose를 호출하기 위해 고민하지 마십시오.

    여기 내 대답을보십시오.

    Disposing of arguments for an iterator block


    UPDATE

    OK는, 당신은 일회용을 소유하고 있는지 여부의 문제는 일회용을 만든 사람 응답하지 않습니다. 소유권은 다른 클래스로 전달 될 수 있습니다. StreamReader은 스트림이 전달 되 자마자 소유권을 가정합니다 (). 따라서 스트림 생성자는 처리를 호출 할 필요가 없으며 StreamReader을 사용하여 처리 할 수 ​​있습니다.

    +1

    StreamReader, 누구? ;) – spender

    +0

    왜냐하면'StreamReader'는 ** 그것을 소유하고 있다고 가정 할 것이기 때문입니다. 스트림을 전달하고 소유권을 제거 할 수 있습니다. – Aliostad

    1

    Microsoft guidelines에 따라 처리 패턴을 구현할 것을 제안합니다. 래퍼 클라이언트가 기본 스트림에서 "깔개"를 당긴 경우 예외를 처리하도록 허용해야합니다. , 적어도 그것에 대해 알고 있습니다.

    +0

    이것은 중요한 포인트입니다. 발신자가 실수했다고 깨닫게하십시오. –

    관련 문제