我目前正在处理我的例外情况:
try {
}
catch (ServiceException ex) {
ModelState.Merge(ex.Errors);
}
catch (Exception e) {
Trace.Write(e);
ModelState.AddModelError("", "Database access error: " + e.Message);
}
这样可行但是我重复了很多次的相同代码。我正在寻找的是关于如何将其转换为外部函数的一些建议。我不一定需要在那里移动try块,但至少需要移动其他代码。
可能是一个传递了Exception和ModelState的函数(作为参考)。任何人都可以建议一个干净的方式,我可以编写这个功能。我在这里问,因为几乎总有人似乎想出了一个我从未想过的解决方案。谢谢萨曼莎。
答案 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中运行。