簡體   English   中英

如何避免在 try-catch 塊中定義“未分配的局部變量”

[英]How to avoid 'Unassigned Local Variable' defined inside a try-catch block

這是我經常面臨的一個錯誤。 雖然我設法通過某種方式繞過它,但它真的讓我很惱火。 在下面的代碼片段中,我想防止來自 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 塊內分配給 reader 的值?

您正在使用一個變量,該變量在該塊之外的 try/catch 塊中分配。 您需要將整個代碼移動到 try 塊中。

您可以像@Svexo 建議的那樣為它分配null ,但是如果流出錯,這將引發異常。

編譯器說use of unassigned variable因為無論如何都會執行 try/catch 塊之后的代碼。

如果你有一個異常,你捕捉它,然后在它之后運行代碼。 這就是您收到此錯誤的原因。

你可以

  • null分配給局部變量,然后在執行其余代碼之前測試它們是否為 null
  • 返回 catch 塊中的函數。
  • 或按照建議將所有代碼移動到 try 塊中@Femaref
 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 塊中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM