在try / catch块中包装Web服务

时间:2008-12-11 14:59:58

标签: asp.net web-services wcf exception

最好将Web服务方法/调用包装到try / catch块中吗?

我不是Web服务请求往往是.NET桌面应用程序崩溃的原因吗?所以我认为所有的调用都应该包含在try / catch中以防止这种情况发生。

好主意?

此外,它应该抛出异常还是只有一个空的捕获?

6 个答案:

答案 0 :(得分:4)

我假设您正在使用WCF,因为您的问题已被标记。使用WFC进行异常处理的一个好习惯是不允许异常通过线路传递给消费者,而是抛出有意义的FaultExceptions。

如果有可能产生异常,你应该总是在你的操作中有一个try ... catch块。如果允许原始摘要冒泡,则只会产生两种情况:如果您已将服务配置为允许出现故障中的异常详细信息,则会自行暴露您的服务内部,以防止出现安全漏洞。或者您没有在服务中配置此消息,消费者会收到一条非常通用的消息,指出出现了问题,这对他们或支持团队来说并不是很有用。

您应该做的是声明一个或多个FaultExceptions,具体取决于您希望用户从您的操作接收的消息,在操作声明中将它们装饰为FaultContracts。然后你可以尝试...捕获特定的异常并抛出特定的错误。你也可以尝试捕获异常并抛出非常一般的错误。

这里的关键是,没有透露太多关于内部操作的信息 - 尤其是堆栈痕迹!

错误只是另一个数据契约,因此它在您的WSDL中声明。这意味着您的消费者可以专门捕获故障,并且可以对您的操作引发的错误作出反应,就好像它是从代码中抛出的异常一样。

希望这有帮助。

乔。

答案 1 :(得分:2)

没关系,但是尝试捕获可以处理的异常类型。

避免捕获任何“异常”,或者,如果您这样做,请记录和/或提醒用户和/或重试调用Web服务。

如果它是一个Windows窗体应用程序,我通常将最后一个“异常”捕获包装在#if DEBUG块中,以避免在调试或测试时隐藏异常。

#if !DEBUG
catch (Exception ex)
{
    // show messagebox, log, etc
}
#endif

答案 2 :(得分:1)

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();
            }
        }
        }
}

这是一个好的做法还是有改进的余地?

答案 3 :(得分:1)

是的,您应该在try-catch中包装Web服务调用。不要使用空捕获,因为它们(大多数)是纯粹的邪恶。你的catch块至少应该记录异常。我不知道您的应用程序逻辑,但可能会向用户显示一些消息(例如“因服务器未提取信息而导致的技术错误”)。

答案 4 :(得分:0)

这是一个可能导致抛出异常的情况,所以是的,它应该包装在try catch块上。

如何处理异常处理程序,它取决于程序逻辑......

答案 5 :(得分:0)

将一个Web服务方法放在try catch块中是一个好主意,因为您声明您不希望因为Web服务方法出错而导致调用应用程序崩溃。

此外,您可以考虑让所有的Web服务方法都返回一个可以包含调用状态的结构或小类,而不是将异常抛回客户端,无论如何都无法对其执行任何操作。错误代码和可以解释错误的友好消息。

豫ICP备18024241号-1