2012-07-02 2 views
1

Я пытаюсь использовать поток сжатия INFLATE в .NET с помощью DeflateStream. Мой код бросает InvalidDataException, хотя я знаю, что данные, которые я передаю, были правильно обработаны алгоритмом DEFLATE (он был протестирован). Я неправильно использую DeflateStream? Мой код выглядит следующим образом:Использование .NET DeflateStream

public byte[] Inflate(byte[] deflateArr) 
    { 
     MemoryStream ms; 

     // try to create a MemoryStream from a byte array 
     try 
     { 
      ms = new MemoryStream(deflateArr); 
     } 
     catch (ArgumentNullException) 
     { 
      return null; 
     } 

     // create a deflatestream and pass it the memory stream 
     DeflateStream ds; 
     try 
     { 
      ds = new DeflateStream(ms, CompressionMode.Decompress); 
     } 
     catch (ArgumentNullException) 
     { 
      return null; 
     } 
     catch (ArgumentException) 
     { 
      return null; 
     } 

     // create a bytes array and read into it 
     byte[] bytes = new byte[4096]; 

     try 
     { 
      ds.Read(bytes, 0, 4096); 
     } 
     catch (ArgumentNullException) 
     { 
      return null; 
     } 
     catch (InvalidOperationException) 
     { 
      return null; 
     } 
     catch (ArgumentOutOfRangeException) 
     { 
      return null; 
     } 
     catch (InvalidDataException) 
     { 
      return null; 
     } 

     // close the memory stream 
     ms.Close(); 

     // close the deflate stream 
     ds.Close(); 

     return bytes; 
    } 

ответ

5

Нет, это не так.

вещи неправильно с этим кодом:

  • Явный вызов Close() вместо того, чтобы использовать using заявление. Наверное, здесь не вредно, а плохая идея.
  • Ловля различные исключения, которые вы действительно не следует ловить на всех, так как они указывают на ошибки программирования
  • Обработка исключений на основе каждого заявления, даже если вы относиться к ним так же, как в коде (так может перехватывать исключения для гораздо большего блока)
  • Игнорирование возвращаемого значения Stream.Read

Вот лучший вариант, при условии, что вы используете .NET 4 (для Stream.CopyTo)

public static byte[] Inflate(byte[] inputData) 
{ 
    using (Stream input = new DeflateStream(new MemoryStream(inputData), 
              CompressionMode.Decompress)) 
    { 
     using (MemoryStream output = new MemoryStream()) 
     { 
      input.CopyTo(output); 
      return output.ToArray(); 
     } 
    } 
} 

Теперь вы может хотите поймать InvalidDataException - лично я бы не в этот момент, но может имеет смысл сделать это. (Если бы это было необходимо, я поймал бы его на вызывающей стороне. Вы можете всегда обернуть этот метод в другом случае, если это необходимо.)

+0

Извините, если это глупый вопрос, но какова недостатка исключений? – cytinus

+1

@cytinus: Он скрывает ошибку. Если ваш метод возвращает null, вы не знаете, почему * и ваша программа будет продолжать работать, тогда как если исключение пузырится, вы можете сказать, что у вас есть ошибка, и вы не пытаетесь продолжать работу с плохими данными , Что-то вроде 'ArgumentNullException' всегда должно быть связано с ошибкой где-то - так что вы хотите найти эту ошибку ASAP. –

+0

О, мой фактический код содержит кучу протоколирования, и если этот метод возвращает null, вызывающий метод убивает программу сообщением об ошибке. Все регистрируется в журнале событий Windows, я просто удалил этот код из вопроса, потому что это не касалось моего вопроса. – cytinus

Смежные вопросы