1

我遇到了一些麻烦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

4 回答 4

4

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

private bool LoadSettingsFile(out StreamReader settingsFile)
{
    try
    {
         settingsFile = new StreamReader("Settings.txt");
         return true;
    }
    catch (IOException) // specifically handle any IOExceptions       
    {
        settingsFile = null;
        return false;
    }
}
于 2012-07-31T13:13:35.233 回答
1

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

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

最终,我建议您允许异常冒泡而不是返回 abool来指示失败 - 或者,返回StreamReader成功并在null失败的情况下返回。

于 2012-07-31T13:14:35.360 回答
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; 
        } 
    }  
于 2012-07-31T13:12:16.710 回答
0

你可以试试

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

接着

StreamReader sr = LoadSettingsFile();
if (sr == null) return false;
于 2012-07-31T13:13:12.067 回答