将web服务方法/调用包装到try/catch块中是否最佳做法?在try/catch块中包装web服务
我不Web服务请求往往是.NET桌面应用程序崩溃的原因?所以我想所有的调用都应该在try/catch中包装以防止这种情况发生。
好主意?
此外,它应该抛出一个异常或只是有一个空的catch?
将web服务方法/调用包装到try/catch块中是否最佳做法?在try/catch块中包装web服务
我不Web服务请求往往是.NET桌面应用程序崩溃的原因?所以我想所有的调用都应该在try/catch中包装以防止这种情况发生。
好主意?
此外,它应该抛出一个异常或只是有一个空的catch?
我假设你使用的是WCF,因为你的问题是用它来标记的。在使用WFC进行异常处理时,一个好的做法是不允许异常通过线路传播给消费者,但是应该抛出有意义的FaultExceptions。
如果您有任何可能产生异常的机会,您应该始终在您的操作中设置try ... catch块。如果您允许原始内容冒泡,则只会出现两种情况:如果您已配置服务以允许在故障中使用异常详细信息,那么您将暴露自己的服务内部,以防出现安全漏洞。或者你没有在你的服务中配置这个,并且消费者得到一个非常通用的消息,表明出现了问题,这对他们或支持团队来说并不是很有用。
您应该做的是声明一个或多个FaultExceptions,具体取决于您希望用户从您的操作中接收到的消息,将它们装饰为操作声明中的FaultContracts。然后你可以尝试......捕捉特定的异常并抛出特定的故障。你也可以有一个try ... catch捕获异常并抛出一个非常普遍的错误。
这里的关键是没有透露太多关于内部操作的信息 - 尤其是堆栈跟踪!
错误只是另一个数据协定,所以它在WSDL中声明。这意味着您的客户可以明确地捕捉到故障,并且可以对您的操作中出现的故障做出反应,就好像它是从代码中抛出异常一样。
希望这会有所帮助。
乔。
这是一个可能导致异常被抛出的情况,所以是的,它应该被包装在try catch块上。
做什么用的这取决于程序逻辑异常处理程序...
把Web服务方法在try catch块是一个好主意,因为你说你不想崩溃主叫应用程序,因为Web服务方法出错了。
此外,与其向客户端抛出异常,无论如何都无法对此做任何事情,您可能会考虑让所有Web服务方法返回可包含调用状态的结构或小类,错误代码和可以解释错误的友好信息。
是的,你应该在try-catch中包装Web服务调用。不要使用空捕获物,因为它们(大部分)都是纯粹的邪恶。你的catch块至少应该记录异常。我不知道您的应用程序逻辑,但可能会向用户显示一些消息(如“服务中的信息未因技术错误而被提取”)。
没关系,但试着去捕捉你可以处理的异常类型。
避免捕获任何“异常”,或者,如果您这样做,请记录和/或警告用户和/或重新尝试调用Web服务。
如果是Windows窗体应用程序,我通常会在#if DEBUG块中包装最后一个“Exception”catch以避免在调试或测试时隐藏异常。
#if !DEBUG
catch (Exception ex)
{
// show messagebox, log, etc
}
#endif
using System;
using System.ServiceModel;
using Entities; //my entities
using AuthenticationService; //my webservice reference
namespace Application.SL.Model
{
public class AuthenticationServiceHelper
{
/// <summary>
/// User log in
/// </summary>
/// <param name="callback"></param>
public void UserLogIn(Action<C48PR01IzhodOut, Exception> callback)
{
var proxy = new AuthenticationServiceClient();
try
{
proxy.UserLogInCompleted += (sender, eventargs) =>
{
var userCallback = eventargs.UserState as Action<C48PR01IzhodOut, Exception>;
if (userCallback == null)
return;
if (eventargs.Error != null)
{
userCallback(null, eventargs.Error);
return;
}
userCallback(eventargs.Result, null);
};
proxy.UserLogInAsync(callback);
}
catch (Exception ex)
{
proxy.Abort();
ErrorHelper.WriteErrorLog(ex.ToString());
}
finally
{
if (proxy.State != CommunicationState.Closed)
{
proxy.CloseAsync();
}
}
}
}
这是一个很好的做法还是有改进的空间?