嵌套的try / catch。好吗?

时间:2012-07-31 09:43:36

标签: wcf web-services exception-handling refactoring try-catch

此代码在BackgroundWorker的DoWork事件处理程序中调用,我正在创建一个WCF客户端并在try块中使用它,如果有异常我想在从处理程序返回之前中止并重试5次。

    private void WorkerDoWork(object sender, DoWorkEventArgs e)
    {            
        var mmc = new ServiceClient();

        try
        {
            e.Result = mmc.SubmitData(measure);
        }
        catch (Exception)
        {
            mmc.Abort();

            mmc = new ServiceClient();

            var counter = 0;

            while ((bool)e.Result == false && counter++ < 5)
            {
                try
                {
                    e.Result = mmc.SubmitData(measure);
                }
                catch (Exception)
                {
                    mmc.Abort();
                    mmc = new ServiceClient();
                }
            }
        }
        finally
        {
            if (mmc.State == CommunicationState.Faulted)
            {
                mmc.Abort();
            }
            else
            {
                mmc.Close();
            }
        }
     }

我对这段代码并不满意,感觉有些东西可疑!特别是嵌套的try / catch。

这段代码好吗?或者我应该重构它?

1 个答案:

答案 0 :(得分:2)

是的,我同意盲目地锤击网络服务是个问题。

很高兴知道您可以处理哪些可能的异常。

这看起来你只是处理一个无法访问的端点,而你可能会收到有关数据格式,类型,限制,限制,身份验证失败,帐户使用限制命中,任何事情的警告!

但eveything被视为重试会修复它,如果没有,它就会破坏!

如何报道遇到的问题?

作为一名优秀的程序员,你应该找出在什么情况下会抛出什么异常并以适当的方式处理它们。如果可以的话。 如果您无法处理它们,请将它们报告给日志记录或用户(如果它是交互式的)。