2011-11-03 150 views
3

我正在使用一个简单的Web客户端从Web服务检索一些XML,我有这个封装在一个简单的尝试,catch块(捕捉WebException)。如下所示;错误捕捉webexception

try 
     { 
      WebClient client = new WebClient(); 
      client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted); 
      client.DownloadStringAsync(new Uri("http://ip/services")); 
     } 
     catch (WebException e) 
     { 

      Debug.WriteLine(e.Message); 
     } 

没有,如果我更改IP地址映射到一个无效的,我会预期它抛出一个异常,并输出消息到调试窗口。但事实并非如此,看起来catch块甚至没有被执行。除了以下内容外,没有任何内容出现,除了调试窗

A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll 
A first chance exception of type 'System.Net.WebException' occurred in System.Windows.dll 
A first chance exception of type 'System.Net.WebException' occurred in System.Windows.dll 

我的代码看起来很对我,所以我不明白为什么异常不被捕获?

+0

您是否试图捕获一般异常?像catch(Exception ex)' – NaveenBhat

+0

我使用异常获得相同的结果。谢谢 – Nathan

回答

5

从您对错误消息的描述中,我会假设抛出的实际异常是类型“FileNotFoundException”。

您是否尝试过捕获异常并检查类型?这可能是网络异常是内部异常。

 try 
     { 
      WebClient client = new WebClient(); 
      client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted); 
      client.DownloadStringAsync(new Uri("http://ip/services")); 
     } 
     catch (Exception ex) 
     { 

      Debug.WriteLine(ex.GetType().FullName); 
      Debug.WriteLine(ex.GetBaseException().ToString()); 
     } 

更新:我只是注意到,你实际上调用的是一个异步方法。

作为一个健全性检查,我会建议交换到非异步方法,并检查由此产生的错误。

WebClient.DownloadString Method (Uri)

您还可以受益于看这个网页,其中通过使用Web客户端作为一个例子捕获异步错误散步。

Async Exceptions

+0

仍然一样,即使我把一个简单的Debug.WriteLine(“测试”);在catch块中它不会被执行,这表明catch块没有被执行。谢谢 – Nathan

+0

回答更新,因为我注意到你正在调用一个异步方法 – fluent

+0

啊谢谢你!我不知道你在做异步事情时必须以不同的方式捕获异常。我没有使用你发布的方法(通过链接),而是检查了DownloadStringCompleted中的错误,这很好。感谢您让我接受答案! – Nathan

3

例外绝不会从DownloadStringAsync提高。它根本不会抛出它,但DownloadString(非Async)会抛出它。我不知道这是否是一个错误,我认为异步方法不会抛出异常除了ArgumentException外,尽管文档states其他。

你要“抓”在DownloadStringCompletedEventHandler错误:

void DownloadStringCompletedEventHandler(object sender, DownloadStringCompletedEventArgs e) 
{ 
    if (e.Error != null) 
    { 
     Debug.WriteLine(e.Error); 
     return; 
    } 

几乎总是可以忽略“第一次机会”的异常,这些都是框架内捕获并做相应的处理。有关更多信息,请参阅this question