2010-01-05 118 views
2

这是我的问题。我有几个Web客户端使用的中间件Web服务。 Web服务是一个打包服务,可以调用多个供应商的Web服务。对供应商的Web服务的调用包装在TryCatch中,但生成的任何异常不会被我的Web服务捕获,它们会陷入客户端应用程序中。尝试抓住 - 不捕捉

我错过了什么吗?这与这个posting有关吗?

这里有一个简单的代码片段:

Dim VendorWebservice as New VendorWebservice 
    Dim VendorResponse As VendorResponse = Nothing 
    Dim ClientResponse as New CustomClientResponse 
    Try 
     VendorResponse = VendorWebservice.VendorWebMethod 
    Catch ex As Exception 
     ClientResponse.ErrorMessage = ex.Message 
     ClientResponse.Status = "VendorError" 
     Return ClientResponse 
    End Try 

编辑

要在一些细节扩展...该代码成功运行99 +%的时间。在罕见的情况下,供应商的网站存在一些问题,即发生此问题时。我已经为一个Web客户端和Web服务打开了VS,并且可以遍历客户端到WS的代码并返回。当我能够重现问题时,我已经将客户代码介绍到了它调用我们的Web服务的位置,然后切换到WS代码并逐步完成,直到它调用供应商代码,然后跳转到客户端代码,而不会触及Catch块或其后的任何代码。

希望有所帮助。

编辑

一些张贴的答案提供了途径,以研究,最notibly有可以创建未从System.Exception派生的异常。 (谁知道?)但是我也发现在.NET 2.0和更高版本中,这些非System.Exceptions被System.Exception中的.NET包装。所以理论上应该把非System.Exceptions定义出来。从理论上讲,在我的阅读中,当调用一个Web服务(就像我的Web服务所做的那样)时,理论上只有两种类型的异常真的应该被看到:System.Net.WebException和System.Web.Services.Protocols.SoapException ,这两者都从System.Exception派生。我不知道如果在调用Web服务时只有两种类型的异常是可能的,但我会把它抛出去。 :)

仍在寻找一个答案......

编辑

再现错误条件已被证明是难以捉摸的。我在代码中引发的每个场景都按预期做出了响应,错误被捕获到了Catch块中。虽然理论上.NET应该包装不从System.Exception派生的异常,但唯一合乎逻辑的答案似乎与Joe的答案一致,即我们所经历的异常不是从System.Exception派生的,因此被视为未处理例外。

+1

粘贴在这里的错误,与堆栈跟踪和所有 – Fredou 2010-01-05 13:40:27

+0

这是很难复制,因为它是通过对呼叫的厂商的侧面的问题引起的,但我会看看我能做些什么。 – Walter 2010-01-05 14:12:37

+0

其中一个组件:CustomClientResponse, VendorResponse或 VendorWebservice 正在抑制该异常,并且不会重新抛出该异常,也不会重新抛出该异常,也不会重新抛出它。 没有这些组件的源代码,或者没有API文档的链接,我们可能无法提供帮助。 – 2010-01-05 16:32:32

回答

2

从异常中抛出异常吗? (是“例外”肯定是指“System.Exception的”)

+0

好问题。我会看看并尝试发布异常。 – Walter 2010-01-05 14:01:15

+0

必须从System.Exception派生异常,但在catch处理程序中的'Exception'可能不会引用'System.Exception'。 我认为有可能抛出异常使用MSIL而不是从System.Exception派生,但我不确定。 – 2010-01-05 14:14:55

+0

如果我转到Catch块中Exception的定义,它会将其显示为System.Exception。我会考虑使用MSIL抛出异常 – Walter 2010-01-05 14:38:38

1

你确定在try/catch内发生异常吗?

尝试移动“如新”的try/catch语句里面太

+0

我很积极。我已经逐步完成了代码,并将其放在try块中以调用供应商的Web服务。 – Walter 2010-01-05 13:19:19

0

是很常见的Web服务不会抛出异常,而是返回了某种错误的对象或错误信息或状态。如果您在调用VendorResponse之后放置断点,则可以检查返回的内容并查看是否有任何“错误”或“状态”属性。如果是这样,您可以测试代码中的内容,然后抛出异常或以其他方式处理这种情况。

+0

我已经在调用供应商的网站后,在catch块和之后设置了一个断点。 – Walter 2010-01-05 13:22:30

0

我个人觉得很难相信,一个错误在此代码出现,并在尝试捕捉没有被抓住。也许放一个终于看看是否执行。

首先,你需要一个体面的方式来重新创建你的错误。

我做的下一件事就是尝试在代码中被抛出的误差精确计算出。我会做的就是暂时在每行代码后面写入日志(Debug.Output maybe)语句,以便确定哪些行实际执行。

当你的错误时,你就可以看到这些日志的输出看,至少在错误发生。现在你知道这一点,它可以让你更好地了解发生了什么。如果所有的日志语句都出现了,那么你就会知道这段代码没有发生错误。我最初的猜测是这就是发生了什么。

因为没有什么是落入捕,那么你就需要排除其他一切可能什么。如果可能的话,将这些代码放到一个小小的测试工具应用中,看看它是否正常工作。

希望其中的一些将有所帮助。

+0

我也对处理的异常未被处理的事实持怀疑态度。但是当供应商遇到问题时,我发现它发生在IDE中。所以我确切知道哪一行代码导致了这个问题,迄今为止所有尝试重现此问题的尝试都产生了正在处理的异常。不幸的是,我没有得到更多的信息,D'OH!你认为供应商会不会再介意他们的问题? :) – Walter 2010-01-05 16:45:32

1

我在之前的工作中的某些代码中看到过这个相同的错误。在我们的例子中,抛出的错误不是从System.Exception派生的。一旦我们知道这一点,处理它就很容易。