11

これは、私が定期的に直面するエラーの 1 つです。なんとか回避できているのですが、本当にイライラします。以下のコード スニペットでは、myRequest.GetResponse() からの例外から保護したいと考えています。

        WebRequest myRequest = WebRequest.Create(baseUri.OriginalString);
        WebResponse myResponse;
        Stream myStream;
        StreamReader reader;
        try
        {
            myResponse = myRequest.GetResponse();
            myStream = myResponse.GetResponseStream();
            reader = new StreamReader(myStream);
        }
        catch (WebException status)
        {
            txtConsole.AppendText("Error in GetLinks::WebException\n" + status.Response);
            txtConsole.AppendText(Environment.NewLine);
        }
        catch
        {
            txtConsole.AppendText("Some error in GetLinks");
            txtConsole.AppendText(Environment.NewLine);
        }

        Regex regex = new Regex(@"\s*(?i)href\s*=\s*(\""([^""]*\"")|'[^']*'|([^'"">\s]+))", RegexOptions.IgnoreCase);
        MatchCollection splits = regex.Matches(reader.ReadToEnd());

今、コードをビルド/コンパイルしようとすると、

「割り当てられていないローカル変数 'reader' の使用」

私の質問ですが、例外がスローされずに try ステートメントがスムーズに実行される場合、コンパイラーが try ブロック内のリーダーに割り当てられた値にアクセスできないのはなぜですか?

4

3 に答える 3

12

そのブロックの外側の try/catch ブロックで割り当てられた変数を使用しています。コード全体を try ブロックに移動します。

@Svexo が提案したように割り当てることもできますがnull、これにより、ストリーム エラーが発生した場合に例外がスローされます。

于 2013-06-08T12:14:26.733 に答える
8

コンパイラはuse of unassigned variable、try/catch ブロックの後のコードがとにかく実行されるためと言います。

例外がある場合は、それをキャッチしてから、コードを実行します。そのため、このエラーが発生します。

次のいずれかを実行できます

  • ローカル変数に代入nullし、残りのコードを実行する前にそれらが null かどうかをテストします
  • catch ブロックで関数を返します。
  • または、提案されているように、すべてのコードを try ブロックに移動します @Femaref
于 2013-06-08T12:17:41.903 に答える
2
 WebRequest myRequest = WebRequest.Create(baseUri.OriginalString);
 WebResponse myResponse = null;
 Stream myStream= null;
 StreamReader reader =null;

これにより、変数が割り当てられます

編集:

このようにする場合は、try/catch の外に if を追加する必要があります

if(reader != null)
{
        Regex regex = new Regex(@"\s*(?i)href\s*=\s*(\""([^""]*\"")|'[^']*'|([^'"">\s]+))", RegexOptions.IgnoreCase);
        MatchCollection splits = regex.Matches(reader.ReadToEnd());
}

あなたのケースでは、すべてをtry / catchブロックに入れる方が良いことに注意してください

于 2013-06-08T12:14:15.630 に答える