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 似乎也失去了作用一样 所以有些无法理解 这是什么情况
...全文
271 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
{
}

111,094

社区成员

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

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

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