变量不在使用 HttpWebRequest 和 WebResponse 的范围内
Variable not within scope using HttpWebRequest and WebResponse
我的变量 httpRes 有问题。基本上这是命令行应用程序的基础知识,它将检查一组给定的 URL 和 return 它们的状态代码,即未授权、重定向、正常等。问题是其中的一个应用程序我的清单不断抛出错误。所以我使用了一个 try catch 子句来捕获错误并告诉我是什么原因造成的。
不幸的是,变量 httpRes 在 try 子句中有效,但在 catch 中无效。它一直被 returned 为 null。我在 try/catch 语句之外调用了 httpRes,所以我希望我的范围是正确的,但无论出于何种原因,对于 catch 语句,值永远不会从 null 改变,只有 try 语句。
这里是引用的代码。
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();
}
}
}
好吧,如果您捕获到异常,那可能是因为 GetResponse 失败了,对吧?所以你还没有为 httpRes
分配任何东西......
在我看来你应该捕捉 WebException
,此时你可以查看响应 - 如果有:
catch (WebException e)
{
// We're assuming that if there *is* a response, it's an HttpWebResponse
httpRes = (HttpWebResponse) e.Response;
if (httpRes != null)
{
...
}
}
几乎 从不 值得写一个裸 catch
块,顺便说一句 - 总是至少捕获 Exception
,但理想情况下捕获更具体的异常类型无论如何,除非您处于应用程序堆栈的顶层。
就我个人而言,我不会为这两段代码使用相同的变量 - 我会在 try 块中声明对成功案例的响应,并在 catch 块中声明对失败案例的响应。另请注意,您通常应该处理 WebResponse
,例如
using (var response = request.GetResponse())
{
// Use the response
}
如果 GetResponse
抛出异常并且您从异常中获得响应,我认为您不需要这样做。
我的变量 httpRes 有问题。基本上这是命令行应用程序的基础知识,它将检查一组给定的 URL 和 return 它们的状态代码,即未授权、重定向、正常等。问题是其中的一个应用程序我的清单不断抛出错误。所以我使用了一个 try catch 子句来捕获错误并告诉我是什么原因造成的。
不幸的是,变量 httpRes 在 try 子句中有效,但在 catch 中无效。它一直被 returned 为 null。我在 try/catch 语句之外调用了 httpRes,所以我希望我的范围是正确的,但无论出于何种原因,对于 catch 语句,值永远不会从 null 改变,只有 try 语句。
这里是引用的代码。
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();
}
}
}
好吧,如果您捕获到异常,那可能是因为 GetResponse 失败了,对吧?所以你还没有为 httpRes
分配任何东西......
在我看来你应该捕捉 WebException
,此时你可以查看响应 - 如果有:
catch (WebException e)
{
// We're assuming that if there *is* a response, it's an HttpWebResponse
httpRes = (HttpWebResponse) e.Response;
if (httpRes != null)
{
...
}
}
几乎 从不 值得写一个裸 catch
块,顺便说一句 - 总是至少捕获 Exception
,但理想情况下捕获更具体的异常类型无论如何,除非您处于应用程序堆栈的顶层。
就我个人而言,我不会为这两段代码使用相同的变量 - 我会在 try 块中声明对成功案例的响应,并在 catch 块中声明对失败案例的响应。另请注意,您通常应该处理 WebResponse
,例如
using (var response = request.GetResponse())
{
// Use the response
}
如果 GetResponse
抛出异常并且您从异常中获得响应,我认为您不需要这样做。