2013-06-08 2 views
7

Это одна ошибка, с которой я регулярно сталкиваюсь. Хотя мне удается так или иначе обойти это, это меня действительно раздражает. В фрагменте кода ниже, я хочу безопасного остерегаться исключений из myRequest.GetResponse()Как избежать «неназначенной локальной переменной», определенной внутри блока try-catch

 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?

ответ

10

Вы используете переменную, которая назначается в блоке try/catch вне этого блока. Вы захотите переместить весь код в блок try.

Вы можете назначить null ему, как предлагается @Svexo, но это вызовет исключение, если ошибка потока отсутствует.

+0

Я использовал для перемещения всего внутри блока try. Но потом я понял, что не могу этого делать всегда. Однако, присваивая ему значение null, а затем проверяя исключение NULL после того, как оператор catch является тем, что мне нужно сделать. – SLearner

+2

Ваше использование «читателя» после блока try показывает зависимость: ваш код зависит от правильного возврата блока try. По определению это должно быть включено в блок try. Когда это становится неуправляемым, вам придется использовать 'null', а затем надеяться, что вы всегда проверяете значение null. – jpaugh

2
WebRequest myRequest = WebRequest.Create(baseUri.OriginalString); 
    WebResponse myResponse = null; 
    Stream myStream= null; 
    StreamReader reader =null; 

Это присвоит переменные

Edit:

Если вы это делаете, как это вы должны добавлять, если за пределами TRY/улова

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

Do обратите внимание, что в вашем случае лучше положить все в блок try/catch

+0

Это приведет к исключению NullPointer, когда читатель не назначен из-за ошибки с потоком. – Femaref

+0

@Femaref Just made a edit :) – Svexo

6

Компилятор говорит use of unassigned variable, потому что код после блока try/catch будет выполнен в любом случае.

Если у вас есть исключение, вы его поймаете, а затем запустите код после него. Вот почему вы получаете эту ошибку.

Вы можете

  • правопреемником null к локальным переменным, а затем проверить, если они нуль перед выполнением остальной части кода
  • возвратного функция в вашем поймать блок.
  • или переместить весь код в блок попробовать, как предложил @Femaref
Смежные вопросы