使用streamreader处理异常时出现问题

时间:2012-07-31 13:07:11

标签: c# windows io streamreader

我在使用StreamReader时出现问题,我有一个设置文件,我在其中保存设置。我想以一种我也可以处理异常的方式打开和关闭文件。

当文件无法加载时,我现在想要返回false。

我创建了一个为我加载文件的函数:

    private bool LoadSettingsFile(out StreamReader SettingsFile)
    {
        try
        {
            SettingsFile = new StreamReader("Settings.txt");
            return true;
        }
        catch
        {
            //Going to solve the exception later, but if I can't I want to return false.
            SettingsFile = new StreamReader(); //You need to assign StreamReader, but you need to open a file for that.
            //'System.IO.StreamReader' does not contain a constructor that takes 0 arguments
            return false;
        }
    } 

我以这种方式调用函数:

StreamReader SettingsFile;

if (!LoadSettingsFile(out SettingsFile))
   return false;

我该如何避免或解决这个问题?

4 个答案:

答案 0 :(得分:4)

如果您无法打开文件,为什么要返回StreamReader个实例?当然你会想要返回null。此外,在您的异常处理中执行 catch-all 从来都不是一个好主意,例如,更具体。

private bool LoadSettingsFile(out StreamReader settingsFile)
{
    try
    {
         settingsFile = new StreamReader("Settings.txt");
         return true;
    }
    catch (IOException) // specifically handle any IOExceptions       
    {
        settingsFile = null;
        return false;
    }
}

答案 1 :(得分:1)

这可以说是不好的做法,因为一般来说,.NET代码更喜欢“抛出异常”而非“返回失败”。这样做的原因是,如果您“返回失败”,您依赖代码的消费者来识别它并对其做些什么。如果抛出异常并且代码的使用者忽略它,则应用程序将失败 - 这通常比继续处于未定义状态更为可取。

在您的情况下,问题是您被迫分配到out参数,即使在那里没有合理的值。一个明显的建议是指定null而不是试图假冒StreamReader。或者,您可以创建一个空的MemoryStream并为此返回一个阅读器,但这有一些极端的长度来掩盖变量在失败情况下没有意义这一事实不应该设置。

最终我建议您允许异常冒泡而不是返回bool来表示失败 - 或者返回 StreamReader以获得成功并返回{{ 1}}在失败的情况下。

答案 2 :(得分:0)

在进入Try / Catch块之前,只需设置SettingsFile = null。据推测,通过返回false,您将在更高级别处理此条件,因此将永远不会使用SettingsFile。所以你的代码看起来像这样:

   private bool LoadSettingsFile(out StreamReader SettingsFile) 
    { 
        SettingsFile = null;
        try 
        { 
            SettingsFile = new StreamReader("Settings.txt"); 
            return true; 
        } 
        catch 
        { 
            //Handle Exception Here
            return false; 
        } 
    }  

答案 3 :(得分:0)

你可以尝试

private StreamReader LoadSettingsFile()
{
    try
    {
        return new StreamReader("Settings.txt");
    }
    catch
    {
        return null;
    }
} 

然后

StreamReader sr = LoadSettingsFile();
if (sr == null) return false;