这是我的问题。我有一个由几个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块或其后的任何代码。
希望有所帮助。
修改
一些已发布的答案为研究提供了途径,最值得注意的是,可以创建的异常不是从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,因此被视为未处理异常。
答案 0 :(得分:2)
抛出的异常是否来自Exception? ('Exception'肯定是指'System.Exception')
答案 1 :(得分:1)
你确定异常发生在try / catch中吗?
尝试在try / catch中移动“as new”
答案 2 :(得分:1)
我之前在上一份工作的代码中看到过同样的错误。在我们的例子中,抛出的错误不是从System.Exception派生的。一旦我们知道了,就可以很容易地正确处理它。
答案 3 :(得分:1)
我知道这是一个非常老的问题,但是我遇到了这种情况,但在网上找不到任何帮助。经过努力,我终于偶然发现了一个答案,尽管我无法解释原因。简而言之:
这是我原始代码无法使用的缩小版本:
Try
File.Copy(FromFile,ToFile,True)
Catch ex As ApplicationException
[Error handled here]
End Try
文件副本很可能会导致文件使用中的错误,因此,我可以将其捕获,这一点很重要,但是如上面的讨论所述,以上内容只会引发错误。
我能够通过将代码更改为以下内容来解决该问题:
Try
File.Copy(FromFile,ToFile,True)
Catch
[Error handled here]
End Try
删除“ ... ex作为ApplicationException”解决了该问题,现在已捕获文件复制操作中的错误。我不喜欢无法检查实际错误,但是在这种情况下,我可以很安全地假设错误是什么。
再次,很抱歉,我不知道为什么为什么;我可能会在某个时候设法弄清楚这一点,但至少我可以摆脱这个问题。
答案 4 :(得分:0)
Web服务通常不会抛出异常,而是返回某种错误对象或错误消息或状态。如果在调用VendorResponse后放置断点,则可以检查返回的内容并查看是否存在“错误”或“状态”属性。如果是这样,您可以测试代码中的内容,然后抛出异常或以其他方式处理这种情况。
答案 5 :(得分:0)
我个人觉得很难相信这段代码中发生错误而没有陷入try catch。也许最后放一个,看看是否执行。
首先,您需要一种不错的方法来重新创建错误。
我要做的下一件事是尝试弄清楚错误被抛出的代码中的确切位置。我要做的是在每行代码之后暂时放入日志记录(Debug.Output)语句,这样你就可以确定实际执行了哪些行。
当您的错误发生时,您将能够查看这些日志的输出,以查看至少发生错误的位置。既然你知道这一点,它可能会让你更好地了解正在发生的事情。如果出现所有日志记录语句,那么您将知道此代码块中未发生错误。我最初的猜测是发生了什么。
由于没有任何东西落入捕获物中,因此您需要消除可能发生的所有其他事情。如果可能的话,将这段代码放入一个小的测试工具应用程序中,看看它是否正常运行。
希望其中一些有用。