当前位置:  开发笔记 > 运维 > 正文

在Silverlight中捕获WCF异常的最佳方法是什么?

如何解决《在Silverlight中捕获WCF异常的最佳方法是什么?》经验,为你挑选了2个好方法。

我有一个使用WCF服务的Silverlight 2应用程序.因此,它对所有对服务方法的调用使用异步回调.如果在其中一个调用之前或期间服务未运行,或崩溃,或网络出现故障等,则会产生异常,如您所料.问题是,我不知道如何捕获这个异常.

因为它是一个异步调用,所以我不能用try/catch块包装我的begin调用,并让它获取一个异常,该异常是在程序从该点开始移动后发生的.

因为服务代理是自动生成的,所以我不能在每个调用EndInvoke的生成函数上放置一个try/catch块(异常实际显示的位置).这些生成的函数也被调用堆栈中的外部代码包围,因此堆栈中没有其他地方可以放置try/catch.

我不能把try/catch放在我的回调函数中,因为异常发生在它们被调用之前.

我的App.xaml.cs中有一个Application_UnhandledException函数,它捕获所有未处理的异常.我可以使用它,但这似乎是一种混乱的方式.我宁愿为真正意想不到的错误(也就是错误)保留这个函数,而不是在这个函数中以特定的方式处理我想要处理的每个环境中的代码.

我错过了明显的解决方案吗?还是我坚持使用Application_UnhandledException?

[编辑]
如下所述,Error属性正是我想要的.抛弃循环的原因是异常被抛出并且似乎未被捕获,但执行能够继续.它触发Application_UnhandledException事件并导致VS2008中断执行,但继续在调试器中允许继续执行.这不是一个真正的问题,它看起来很奇怪.



1> dcstraw..:

我在服务方法完成事件处理程序中检查事件args的Error属性.我没有遇到没有被调用的事件处理程序的问题.在服务器发生故障的情况下,调用需要几秒钟,然后在Error属性中返回ProtocolException.

假设你已经尝试了这个并且你的回调真的永远不会被调用,你可能会考虑自定义生成的代理类.看到这篇文章.



2> wahrhaft..:

我找到了一个讨论这个问题的论坛帖子,并提到最佳做法是使用Error属性.在这个帖子和我自己的经历之间,这是我可以得出的结论:

在普通的.NET代码中,生成的代理类通过将异常放在Error属性中而不是抛出异常来正确处理异常.

在Silverlight中,生成的代理类设置Error属性,但不完全处理异常.调试器会选择异常,它会弹出异常框,并显示消息"ProtocolException未被用户代码处理".尽管有这条消息,但异常似乎并没有真正使它成为Application_UnhandledException函数.

我希望这是他们将在最终版本中修复的内容之一.

现在,我将使用Error属性并处理调试器中断执行.如果它太烦人了,我可以关闭ProtocolException的异常中断.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有