2016-05-04 4 views
0

Рассмотрим следующий фрагмент кода:Исключение сбоя при удалении результата?

public static Stream OpenWavStream(string path) 
{ 
    var stream = new FileStream(path, FileMode.Open); 

    try 
    { 
     stream.Seek(44, SeekOrigin.Current); 
    } 
    catch (Exception) 
    { 
     stream.Dispose(); 
     throw; 
    } 

    return stream; 
} 

Я открывающий поток WAV, данные которого всегда начинается с 44. Если смещение стремится к тому, что смещение не может, поток расположен, в противном случае он возвращается. Учитывая, что catch (Exception) is considered bad practice, уместно ли в этом случае?

Следует ли скорее исследовать конкретные исключения (даже если поток должен быть удален, если в вызове Stream.Seek происходит какое-либо исключение) или переместить его в блок finally?

+0

еще раз прочтите документацию msdn. В ней объясняется, как вы не должны ловить общие исключения. – MethodMan

ответ

1

catch (Exception) плохая практика, если вы используете его, чтобы проглотить исключения и их не обрабатываете. Вы немедленно перебрасываете исключение и делаете это правильно (например, вы не делаете throw ex;). Вам нужно будет удалить поток для любого исключения, поэтому вы не должны улавливать определенные исключения здесь.

Ваш код в порядке. Однако я скептически отношусь к полезности метода. Не видя остальной части приложения, может потребоваться создать поток в блоке using даже с помощью вспомогательного метода.

//In your callee code 
using (var stream = new FileStream(path, FileMode.Open)) 
{ 
    ConfigureStream(steam); 
    //Other stuff.. 
} 

public static void ConfigureStream(Stream stream) 
{ 
    stream.Seek(44, SeekOrigin.Current); 
} 

Или вы можете сначала проверить длину потока, чтобы полностью исключить исключение.

+0

Спасибо, что ответили на мой вопрос! Я бы предпочел использовать, если бы мог, но не могу, потому что во время открытия файла файл wav еще не завершен, так что, к сожалению, это не вариант. Исключения, о которых я беспокоюсь, это IOException, SecurityException, UnauthorizedAccessException. Поиск за пределами потока поддерживается, поэтому не будет никаких проблем с тем, что я предполагаю. – hl3mukkel

+0

Я не уверен, что вы подразумеваете под этим ... вы все равно сможете использовать 'using'. Все, что он делает, это обернуть ваш код в блок 'try {} finally {}', чтобы обработать распоряжение для вас. В любом случае вам всегда нужно удалять поток для исключения, поэтому требуется 'catch (Exception)' – Rob

2

Только в том случае, если Stream не загружается. Что-то я использую:

string fileName = "C:\\PCM.wav"; 

if (!System.IO.File.Exists(fileName)) 
{ 
LogStatus("Wave file not found."); 
return; 
} 
else 
{ 
WaveFileByteArray = File.ReadAllBytes(fileName); 
LogStatus("Wave file Loaded!" + Environment.NewLine); 
} 

Это работает нормально.

затем играть/Использование:

System.Media.SoundPlayer soundPlayer; 
soundPlayer.Stream.Seek(0, SeekOrigin.Begin); 
soundPlayer.Stream.Write(WaveFileByteArray, 0, WaveFileByteArray.Length); 
soundPlayer.Play(); 

Опираясь на Exception, чтобы поймать возможных ошибок, как представляется, не лучшая практика, если ошибка не является неожиданным. Лучше всего справляться с возможными ошибками до их появления.

+0

Эй, спасибо за ваш ответ. Я не могу прочитать файл в памяти просто потому, что во время открытия потока файлов wav-файл еще не завершен. Кроме того, я не могу задержать его либо потому, что данные wav нужны только тогда, когда эти биты выписаны. Спасибо за код SoundPlayer, но он мне не нужен :) – hl3mukkel

+1

Вы не можете позвонить: «stream.Seek (44, SeekOrigin.Current)»; если нет 44 для вызова. Вам нужно переосмыслить свою стратегию. Может быть, несколько файлов Wav? Недостаточно информации. –

1

Почему бы не использовать используемый метод вызова и оставить закрытие пара в системе. использование будет закрывать поток, даже если есть исключение.

public static Stream OpenWavStream(string path) 
    { 
     var stream = new FileStream(path, FileMode.Open); 
     stream.Seek(44, SeekOrigin.Current); 
     return stream; 
    } 

public static void UseWaveStream() 
    { 
     try 
     { 
      using(Stream thisStream = OpenWavStream("C:\\myfile.txt")) 
      { 
       // do whatever 
      } 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine(ex.ToString()); 
     } 
    } 
+0

Я не могу использовать оператор using, потому что данные записываются в поток wav после его открытия. Я не могу прочитать файл в памяти просто потому, что во время открытия потока файлов wav-файл еще не завершен. Кроме того, я не могу задержать его либо потому, что данные wav нужны только тогда, когда эти биты выписаны. – hl3mukkel

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