考虑以下代码:
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 :(得分: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();
依赖异常来捕获可能的错误(如所示)并非最佳做法,除非错误是意外的。在可能的错误发生之前处理它们是最佳做法。
答案 1 :(得分:1)
为什么不在调用方法中使用using块并将蒸汽关闭留给系统。即使存在异常,using也将关闭流。
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());
}
}
答案 2 :(得分: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);
}
或者,您可以先检查流的长度,以完全避免异常。