WebException was unhandled by user code是个什么情况

crystal_lz 2015-07-16 04:50:19
我写了一个大概如下的 static 函数

public static RequestResult GetRequestResult(string strUrl, string strRefer...) {
string strHtml = null;
byte[] byData = null;
HttpWebRequest request = null;
HttpWebResponse response = null;
...
try {
response = (HttpWebResponse)request.GetResponse(); //timed out
...
RequestResult rr = new RequestResult(request, response, strHtml, byData);
return rr;
} catch (WebException ex) {
if (ex.Response == null) throw ex;
response = (HttpWebResponse)ex.Response; //Response = null
strHtml = GetHtmlFromResponse(response, ref byData);
return new RequestResult(request, response, strHtml, byData);
} finally {
request.Abort();
if (response != null)
response.Close();
}
}

调用的地方 大概这样:

private void Test(){
try{
...
RequestResult rr = GetRequestResult("http://...",...);
...
}catch(Exception ex){ ... }
}

但是实际上是这样的:

为什么 我上面判断了 ex.Response == null 而下面却是 null
而且 我在 Test() 里面也有 try catch 可是为什么没有捕获到异常?

并不是每次都会出现这样的情况 看几率 我有几个线程都在调用 GetRequestResult 函数 但是 这并不存在什么冲突问题啊 最让我郁闷的是 明明有判断 ex.Response == null 可是为什么那个判断似乎失去了作用一样 代码依然执行下去了 难道有什么可能使得 ex.Response 在下一瞬间就变为null了?是谁修改它成为了null 而且 Test() 里面的 try catch 似乎也失去了作用一样 所以有些无法理解 这是什么情况
...全文
254 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
crystal_lz 2015-07-17
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
你这个是强行转换异常,不是null异常…… ex.Response不是你强转的异常
你没有看到 上面有 判断null的吗 而且 就算是异常了 我在函数调用外面也有 try catch 可以没有捕获到。。。。
  • 打赏
  • 举报
回复
你这个是强行转换异常,不是null异常…… ex.Response不是你强转的异常
把分全给哥 2015-07-17
  • 打赏
  • 举报
回复
不要吝啬你的括号
crystal_lz 2015-07-17
  • 打赏
  • 举报
回复
引用 13 楼 Z65443344 的回复:
所以最大的可能,就是发生了其他异常,不能被强制转换成HttpWebResponse的 或者它根本就不能转换成HttpWebResponse,只不过平时不出错,一旦进入catch就会崩溃 只不过等你断点调试再看,这个值就已经被其他线程改掉了. 所以最好你还是在catch里再加个try,然后在catch里输出这个异常,看到底是不是因为类型不匹配
看我第二段代码 在调用函数外面有 try catch 但是没有捕获到异常 而且就算多线程 也不影响啊 所有变量都是在函数里面声明的 线程之间互不影响 难道其他线程里面的代码可以改变另一个线程里面声明的变量值?
crystal_lz 2015-07-17
  • 打赏
  • 举报
回复
引用 11 楼 Z65443344 的回复:
没看出你这里有任何必要使用静态函数 你改成非静态的试过吗
我几十个类都要去访问页面 难道我要每个类里面都要new一个我的这个类? 我直接一个WebHelper类里面写所有的页面访问的函数 岂不是很方便 直接WebHelper.XXX就用 而且类也不需要构造传参什么的 全部都是可以独立使用的 为什么要写成非静态 Net不是也有很多静态的么 File.XXX Path.XXX ...
於黾 2015-07-17
  • 打赏
  • 举报
回复
所以最大的可能,就是发生了其他异常,不能被强制转换成HttpWebResponse的 或者它根本就不能转换成HttpWebResponse,只不过平时不出错,一旦进入catch就会崩溃 只不过等你断点调试再看,这个值就已经被其他线程改掉了. 所以最好你还是在catch里再加个try,然后在catch里输出这个异常,看到底是不是因为类型不匹配
於黾 2015-07-17
  • 打赏
  • 举报
回复
此外,既然你已经使用了多线程,那么就不能断点调试了 因为你当前的断点是将某个线程中断了,但是其他线程还在执行,所以就会修改掉这个值 也就是说,你在调试器里debug看值,没法确定到底看的是当前对象的哪个实例的值
於黾 2015-07-17
  • 打赏
  • 举报
回复
没看出你这里有任何必要使用静态函数 你改成非静态的试过吗
crystal_lz 2015-07-17
  • 打赏
  • 举报
回复
引用 9 楼 starfd 的回复:
开发net的也是人,也会出bug,你没看补丁一个接一个吗?
我知道啊 都发现好多了 尤其是自带的控件 好多有bug 比如TreeView上就一大堆bug双击事件 还有直接对借点赋值替换原来的借点 tree上会多显示一个 但是count属性确实对的 貌似listbox还是listview滚动条 会在某些时候让最后一行显示不全 但是 这些都有修补方案啊 可是这个不知道要怎么搞合适 而且还不一定就是它有问题 感觉应该是我的问题 哪里忽略了细节。。。
  • 打赏
  • 举报
回复
开发net的也是人,也会出bug,你没看补丁一个接一个吗?
crystal_lz 2015-07-17
  • 打赏
  • 举报
回复
引用 7 楼 starfd 的回复:
也许是你发现了一个bug
你在逗我。。
  • 打赏
  • 举报
回复
也许是你发现了一个bug
crystal_lz 2015-07-17
  • 打赏
  • 举报
回复
引用 5 楼 starfd 的回复:
估计跟你的多线程代码有关吧
static函数 而且没有任何公共变量
  • 打赏
  • 举报
回复
估计跟你的多线程代码有关吧
crystal_lz 2015-07-17
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
好吧,没细看你这个问题
你把你的代码改成下面的样子看看还会有这样的问题吗?
if(...)
{
throw;
}
else
{
}


直接报错到花括号上 是不是很奇葩?、、、
  • 打赏
  • 举报
回复
好吧,没细看你这个问题 你把你的代码改成下面的样子看看还会有这样的问题吗?
if(...)
{
throw;
}
else
{
}

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧