2013-06-08 9 views
7

Questo è un errore che devo affrontare regolarmente. Anche se riesco ad aggirarlo usando un modo o un altro, mi infastidisce davvero. Nel frammento di codice qui sotto, voglio salvaguardare contro le eccezioni da myRequest.GetResponse()Come evitare 'Variabile locale non assegnata' definita all'interno di un blocco 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()); 

Ora, quando provo ad installare/compilare il codice, si dice

"L'utilizzo di non assegnato variabile 'reader' locale"

Ora la mia domanda, se istruzione try fili liscio, senza alcuna eccezione gettati, perché non può accedere compilatore il valore assegnato per il lettore all'interno del blocco try?

risposta

10

Si sta utilizzando una variabile, assegnata in un blocco try/catch, all'esterno di tale blocco. Dovrai spostare l'intero codice nel blocco try.

È possibile assegnare null ad esso come proposto da @Svexo, ma verrà generata un'eccezione in caso di errore del flusso.

+0

Ho usato per spostare tutto all'interno del blocco try. Ma poi ho capito che non potevo farlo sempre. Tuttavia, assegnarlo a null e quindi verificare l'eccezione NULL dopo l'istruzione catch è ciò che devo fare. – SLearner

+2

L'uso di 'reader' dopo il blocco try rivela una dipendenza: il codice dipende dal corretto ritorno del blocco try. Per definizione, questo dovrebbe essere incluso nel blocco try. Quando ciò diventa ingestibile, dovrai usare "null" e quindi sperare che tu controlli sempre nulla. – jpaugh

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

Questo assegnerà le variabili

Edit:

Se lo fate come questo si dovrebbe aggiungere un se al di fuori tua try/catch

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

Do nota nel tuo caso è meglio mettere tutto nel blocco try/catch

+0

Questo si tradurrà in deroga NullPointer quando il lettore non è assegnato a causa di errore con il flusso. – Femaref

+0

@Femaref Ho appena fatto una modifica :) – Svexo

6

Il compilatore dice use of unassigned variable perché il codice dopo il blocco try/catch verrà comunque eseguito.

Se si dispone di un'eccezione, la si cattura, quindi si esegue il codice dopo di essa. Ecco perché ottieni questo errore.

È possibile sia

  • assegnare null alle variabili locali e quindi verificare se sono nulla prima di eseguire il resto del codice
  • di ritorno della funzione nel blocco catch.
  • o spostare tutto il codice nel blocco try come suggerito @Femaref
Problemi correlati