返回错误消息与抛出异常

7

我正在为一个ASP.NET MVC项目编写一个类库。该类库将返回实体并执行基本功能。在之前的项目中,我使用了以下逻辑:

public class MyClassLibrary
{
     public Response<ResponseMessage, MyEntity> GetMyEntity()
     {
         //Some code
     }
     public ResponseMessage SaveMyEntity(MyEntity e)
     {
         //Some code
     }
}
public class BaseController:Controller
{
    public ActionResult JsonDataSourceRequest<T>(Func<Response<ResponseMessage, List<T>>> operation, [DataSourceRequest] DataSourceRequest request)
    {
        try
        {
            Response<ResponseMessage, List<T>> ret = operation();
            if (ret.message.type == ReturnType.OK)
            {
                return Json(ret.result.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
            }
            else
                return ConvertToJson(ret.message);

        }
        catch (Exception ex)
        {
            ResponseMessage m = new ResponseMessage();
            m.type = ReturnType.ERROR;
            m.text = ex.text;
            return ConvertToJson(m);
        }
    }

    public ActionResult PartialView<T>(Func<Response<ResponseMessage, T>> operation)
    {
        //Some code
    }

    public ActionResult Action(Func<ResponseMessage> operation)
    {
        //some code
    }
}
[CustomAuthorize]
public class MyController : BaseController
{
    public ActionResult MyEntityRead([DataSourceRequest] DataSourceRequest request)
    {
        return base.JsonDataSourceRequest(() =>
        {
            return MyEntityService.GetAll();
        }, request);
    }
}

为了使用BaseController的功能,我总是返回Response或ResponseMessage。

现在我认为我可以使用自定义异常类,而不是从所有方法中返回ResponseMessage。我可以抛出这些异常。

我想知道这是否是一种良好的做法。

提前致谢。


非常感谢nvoigt和@darin的快速回复。您认为与项目规则相关的错误是异常情况还是正常情况?例如, throw UserCannotBeYoungerThan18(""); 是否不好? 我应该像“处理所有可以处理的事情”这样的座右铭吗? - aldebaran
3个回答

9

我想知道这是否是一种好的实践。

不,将异常用于处理非异常流是不好的设计。抛出异常会带来一定的成本,如果可以使用正常流程处理您的情况,应避免使用异常。


9

如果某个条件是异常情况,应该抛出异常。如果某个条件是正常预期情况,应该使用返回值。只有您能够确定在您的情况下哪种方法适用。


1
非常感谢您的快速回复。您认为与项目规则相关的错误是异常情况还是正常情况?例如, throw UserCannotBeYoungerThan18(""); 是否不好? 我应该像“处理所有可以处理的事情”这样的座右铭吗? (我在这里重复上面的问题,因为只有一个额外的用户错误) - aldebaran
1
如果您假定所有数据都是有效的,并且18岁以下的某些人是个例外,因为它应该已经在其他地方处理过了,则抛出异常。如果您的检查是第一个检查此事的实例,那么我认为大多数人并不是特殊情况。有18岁以下的人是正常的,您应该找到一个正常的流控制方式来处理这个问题。 - nvoigt
我明白了,你的回答很清晰且令人满意,非常感谢 :) - aldebaran

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接