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そこに割り当てるための適切な値がない場合でも、パラメータに割り当てることを余儀なくされることです。明らかな提案の1つは、nullを偽造しようとするのではなく、割り当てることStreamReaderです。または、空を作成してそのリーダーを返すこともできますが、これは、変数が失敗した場合には意味がなく、設定すべきではないというMemoryStream事実を隠すために、極端な長さになります。

最終的には、失敗を示すためにaを返すのではなく、例外をバブルすることを許可することをお勧めします。boolあるいは、成功の場合はを返し失敗の場合は戻ります。StreamReadernull

于 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 に答える