处理结果时是否适当捕获异常?

时间:2016-05-04 22:52:31

标签: c# exception try-catch

考虑以下代码:

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块中?

3 个答案:

答案 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);
}

或者,您可以先检查流的长度,以完全避免异常。