我可以将我的异常代码移动到处理函数。所以我不必重复相同的代码

时间:2011-12-19 14:12:15

标签: c#

我目前正在处理我的例外情况:

try {

        }
        catch (ServiceException ex) {
            ModelState.Merge(ex.Errors);
        }
        catch (Exception e) {
            Trace.Write(e);
            ModelState.AddModelError("", "Database access error: " + e.Message);
        }

这样可行但是我重复了很多次的相同代码。我正在寻找的是关于如何将其转换为外部函数的一些建议。我不一定需要在那里移动try块,但至少需要移动其他代码。

可能是一个传递了Exception和ModelState的函数(作为参考)。任何人都可以建议一个干净的方式,我可以编写这个功能。我在这里问,因为几乎总有人似乎想出了一个我从未想过的解决方案。谢谢萨曼莎。

3 个答案:

答案 0 :(得分:5)

你可以创建一个接受Action的方法,并在try / catch块中调用它:

private void RunAndHandleExceptions(Action action)
        {
            try
            {
                action.Invoke();
            }
            catch (ServiceException ex)
            {
                ModelState.Merge(ex.Errors);
            }
            catch (Exception e)
            {
                Trace.Write(e);
                ModelState.AddModelError("", "Database access error: " + e.Message);
            }
        }

并称之为:

RunAndHandleExceptions(new Action(() =>
                {
                    //Do some computing
                }));

编辑:带参数(例如,可以在控制台程序中运行):

private static void ParameterizedTask()
    {
        Task.Factory.StartNew(new Action<object>((y) =>
        {
            Console.WriteLine(y);
        }), 5);
        Thread.Sleep(1500);
    }
//OUTPUT: 5

有关详细信息,请查看this主题。

答案 1 :(得分:2)

(更新以符合OP在评论中的新要求)

private void HandleException(Action<IEnumerable<string>> action, 
  IEnumerable<string> parameters)
{
  try {
    action(parameters);
  }
  catch (ServiceException ex) {
    ModelState.Merge(ex.Errors);
  }
  catch (Exception e) {
    Trace.Write(e);
    ModelState.AddModelError("", "Database access error: " + e.Message);
  }
}

可以使用lambda调用,例如:

HandleException((parameters) => Console.WriteLine(parameters.FirstOrDefault()), 
                                new string[] {"Pretty safe in this case"});

答案 2 :(得分:1)

除了将注释中建议的异常传递给另一个函数之外,您还可以将代码作为Action传递给函数,然后函数将在try catch中运行。