C# 处理结果时捕获异常是否合适?

C# 处理结果时捕获异常是否合适?,c#,exception,try-catch,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;

考虑以下代码:

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开始。如果对该偏移量的搜索失败,则处理流,否则返回流。考虑到这一点,在这种情况下是否合适


我们应该研究具体的异常(即使在stream.Seek调用中发生任何类型的异常时应该处理流)还是将其移动到finally块中?

仅当流无法加载时才进行。我用的东西:

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();

依赖异常来捕获可能的错误(如所示)不是最佳实践,除非错误是意外的。在可能的错误发生之前处理它们是最佳做法。

仅当流无法加载时。我用的东西:

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();

依赖异常来捕获可能的错误(如所示)不是最佳实践,除非错误是意外的。在可能的错误发生之前处理它们是最佳实践。

为什么不在调用方法中使用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());
        }
    }

为什么不在调用方法中使用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());
        }
    }
catch(Exception)
如果您使用它来吞咽异常而不处理它们,那么这是一种不好的做法。您立即重新抛出异常,并正确地执行它(例如,您没有执行
throw-ex;
)。您需要为任何异常处理流,因此不应在此处捕获特定异常

你的代码非常好。然而,我对这种方法的有效性表示怀疑。在看不到应用程序其余部分的情况下,被调用方使用块在
中创建流可能是有意义的,即使是使用helper方法

//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);
}
或者,您可以先检查流的长度,以完全避免异常。

catch(exception)
如果您使用它来吞咽异常而不处理它们,这是一种不好的做法。您立即重新抛出异常,并正确地执行它(例如,您没有执行
throw-ex;
)。您需要为任何异常处理流,因此不应在此处捕获特定异常

你的代码非常好。然而,我对这种方法的有效性表示怀疑。在看不到应用程序其余部分的情况下,被调用方使用
块在
中创建流可能是有意义的,即使是使用helper方法

//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);
}

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

请再次阅读msdn文档。。它解释了您不应捕获一般异常的方法。请再次阅读msdn文档。。它解释了如何不捕获一般异常。我不能使用using语句,因为数据是在wav流打开后写入的。我无法将文件读入内存,因为在打开文件流时,wav文件尚未完成。此外,我也不能延迟它,因为在写入这些位时需要wav数据。我不能使用using语句,因为数据是在wav流打开后写入的。我无法将文件读入内存,因为在打开文件流时,wav文件尚未完成。此外,我也不能延迟,因为当这些位被写出来的时候,wav数据是需要的。嘿,谢谢你的回复。我无法将文件读入内存,因为在打开文件流时,wav文件尚未完成。此外,我也不能延迟它,因为当这些位被写出来时,需要wav数据。谢谢你的SoundPlayer代码,但我不需要:)你不能呼叫:“stream.Seek(44,SeekOrigin.Current);”如果没有44可呼叫。你需要重新考虑你的策略。可能有多个Wav文件?没有提供足够的信息。嘿,谢谢你的回复。我无法将文件读入内存,因为在打开文件流时,wav文件尚未完成。此外,我也不能延迟它,因为当这些位被写出来时,需要wav数据。谢谢你的SoundPlayer代码,但我不需要:)你不能呼叫:“stream.Seek(44,SeekOrigin.Current);”如果没有44可呼叫。你需要重新考虑你的策略。可能有多个Wav文件?没有提供足够的信息。谢谢回答我的问题!如果可以,我更愿意使用,但我不能,因为在打开文件时,wav文件还没有完成,所以很遗憾,这不是一个选项。我担心的异常是IOException、SecurityException、UnauthorizedAccessException。支持在流的末尾之外进行搜索,因此我想这不会有任何问题。我不确定你的意思。。您应该仍然能够使用
使用。它所做的只是将代码包装在
try{}finally{}
块中,以便为您处理dispose。在任何情况下,您都需要在异常上处理流,因此需要
catch(exception)
。谢谢您回答我的问题!如果可以,我更愿意使用,但我不能,因为在打开文件时,wav文件还没有完成,所以很遗憾,这不是一个选项。我担心的异常是IOException、SecurityException、UnauthorizedAccessException。支持在流的末尾之外进行搜索,因此我想这不会有任何问题。我不确定你的意思。。您应该仍然能够使用使用。它所做的只是将代码包装在
try{}finally{}
块中,以便为您处理dispose。在任何情况下,您都需要在异常上处理流,因此需要
catch(exception)