2015-10-06 4 views
0

J'ai un problème avec ma variable httpRes. Fondamentalement, ce sont les bases d'une application en ligne de commande qui va vérifier un ensemble d'URL donnés et renvoyer leur code d'état, c'est-à-dire non autorisé, rediriger, ok, etc Le problème est l'une des applications dans ma liste continue de jeter une erreur. J'ai donc utilisé une clause try catch pour saisir l'erreur et me dire ce qui l'a causé.Variable hors portée utilisant HttpWebRequest et WebResponse

Malheureusement, la variable httpRes fonctionne dans la clause try, mais pas dans la capture. Il continue d'être retourné comme nul. J'ai appelé httpRes en dehors de l'instruction try/catch donc j'espère que ma portée est correcte mais pour une raison quelconque, la valeur ne change jamais de null pour l'instruction catch, seulement l'instruction try.

Voici le code référencé.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Net; 
using System.Text; 
using System.Threading.Tasks; 

namespace URLMonitor 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string url1 = "https://google.com"; //removed internal URL for security reasons. 
      HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(url1); 
      httpReq.AllowAutoRedirect = false; 
      HttpWebResponse httpRes = null; 

      try 
      { 
       httpRes = (HttpWebResponse)httpReq.GetResponse(); 
       if (httpRes.StatusCode == HttpStatusCode.OK) 
       { 
        Console.WriteLine("Website is OK"); 
        // Close the response. 
        //httpRes.Close(); 
       } 
      } 
      catch 
      { 
       if (httpRes != null) 
       { 
        if (httpRes.StatusCode == HttpStatusCode.Unauthorized) 
        { 
         Console.WriteLine("Things are not OK"); 
         //httpRes.Close(); 
        } 
       } 
       else 
       { 
        Console.WriteLine("Please check the URL and try again.."); 
        //httpRes.Close(); 
       } 
      } 
      Console.ReadLine(); 

     } 
    } 
} 

Répondre

1

Bien, si vous attrapez une exception, ce serait probablement parce que GetResponse a échoué, non? Donc, vous ne l'auriez pas affecté quoi que ce soit à httpRes encore ...

Il me semble que vous devriez prendras WebException, à quel point vous pouvez regarder la réponse - s'il y a une:

catch (WebException e) 
{ 
    // We're assuming that if there *is* a response, it's an HttpWebResponse 
    httpRes = (HttpWebResponse) e.Response; 
    if (httpRes != null) 
    { 
     ... 
    } 
} 

Il est à peu près jamais vaut écrire un bloc catch nu, btw - toujours au moins attraper Exception, mais idéalement attraper un type d'exception plus spécifique de toute façon, sauf si vous êtes au plus haut niveau de votre pile d'applications.

Personnellement, je n'utiliserais pas la même variable pour les deux parties de code - je déclarerais la réponse pour le cas de succès dans le bloc try, et la réponse pour le cas d'échec dans le bloc catch. Notez également que vous devez normalement disposer de votre WebResponse, par ex.

using (var response = request.GetResponse()) 
{ 
    // Use the response 
} 

Je ne crois pas que vous devez faire si GetResponse déclenche une exception et vous obtenez la réponse de l'exception.

+0

C'était le correctif. Donc, apparemment, je n'attrapais pas cette erreur spécifique. J'ai supposé qu'une capture générique tout attraperait n'importe quelle exception au lieu de devoir spécifier quelle exception j'essaye d'attraper. –

+1

@ stack-flo: Oui, il * va * attraper une exception (il a attrapé celui qui a été lancé) - mais vous l'avez attrapé sans spécifier une variable, ce qui signifie que vous ne pouvez pas utiliser les informations de l'exception ... et sans spécifier le type d'exception à utiliser, vous ne pouvez pas utiliser la propriété spécifique au type d'exception. –

+0

J'ai compris. Merci pour l'explication approfondie! –