6

在 MVC 中,管理业务异常或错误的最佳方法是什么?我找到了几个解决方案,但不知道该选择哪个。

解决方案 1

public Person GetPersonById(string id)
{
    MyProject.Model.Person person = null;
    try
    {
        person = _personDataProvider.GetPersonById(id);
    }
    catch 
    { 
        // I use a try / catch to handle the exception and I return a null value
        // I don't like this solution but the idea is to handle excpetion in 
        // business to always return valid object to my MVC.
        person = null; 
    }
    return person;
}

解决方案 2

public Person GetPersonById(string id)
{
    MyProject.Model.Person person = null;
    person = _personDataProvider.GetPersonById(id);
    // I do nothing. It to my MVC to handle exceptions
    return person;
}

解决方案 3

public Person GetPersonById(string id, ref MyProject.Technical.Errors errors)
{
    MyProject.Model.Person person = null;
    try
    {
        person = _personDataProvider.GetPersonById(id);
    }
    catch (Exception ex)
    { 
        // I use a try / catch to handle the exception but I return a 
        // collection of errors (or status). this solution allow me to return 
        // several exception in case of form validation.
        person = null; 
        errors.Add(ex); 
    }
    return person;
}

解决方案 4

// A better idea ?
4

4 回答 4

1

让异常在应用程序级别处理。我建议使用解决方案 2。当您想在某些异常发生时更改逻辑时,您可以使用 try..catch 块,否则只需将其留给应用程序基础架构即可。

于 2012-12-03T14:55:24.757 回答
1

我还建议您考虑空对象模式。与其返回 null,不如返回一个空对象,这样您就不必执行多个 if null 检查。您应该创建一个抽象的 Person 类,该类具有像 NullPerson 这样包含默认值的静态属性。如果您的 DAL 返回 null,您将返回 NullPerson。您可以找到有关空对象模式的更多信息。

于 2013-03-06T09:31:58.490 回答
0

系统错误应该尽快被捕获,而每个使用你的类的对象都应该实现必要的代码来捕获可能的错误。在最低级别捕获系统错误可以让您决定您打算做什么: - 不返回值 - 抛出自定义错误 - 重新抛出系统错误

在系统错误和您的自定义错误之间插入一个抽象层是您可以引入需要不同注意的新错误。IE:如果错误是 FileNotFoundException,您可能想要区分正常错误(即:文件是每日报告,但文件请求代表未来报告)或不(文件应该存在)

我更喜欢解决方案 3,即使在第一阶段您只需在需要时重新抛出常规异常。

哔叽

于 2012-12-03T10:44:37.080 回答
0

这取决于你的要求。

  1. 如果您只想知道我们的流程是否成功执行,则建议使用流程 2。
  2. 如果您愿意编写一些错误日志,那么 Process 3 是最佳选择。
  3. 如果您不想使用复杂的方法,但又想处理异常并写入日志,则建议使用 Process 1。

问候, Pavan.G

于 2012-12-03T10:58:12.063 回答