C# 返回错误消息vs抛出异常

C# 返回错误消息vs抛出异常,c#,asp.net-mvc,error-handling,C#,Asp.net Mvc,Error Handling,我正在为asp.NETMVC项目编写类库。类库将返回实体并执行基本函数。在上一个项目中,我使用了如下逻辑: public class MyClassLibrary { public Response<ResponseMessage, MyEntity> GetMyEntity() { //Some code } public ResponseMessage SaveMyEntity(MyEntity e) {

我正在为asp.NETMVC项目编写类库。类库将返回实体并执行基本函数。在上一个项目中,我使用了如下逻辑:

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);
    }
}
公共类MyClassLibrary
{
公共响应GetMyEntity()
{
//一些代码
}
公共责任信息SaveMyEntity(MyEntity e)
{
//一些代码
}
}
公共类BaseController:控制器
{
public ActionResult JsonDataSourceRequest(Func操作,[DataSourceRequest]DataSourceRequest请求)
{
尝试
{
响应ret=操作();
if(ret.message.type==ReturnType.OK)
{
返回Json(ret.result.ToDataSourceResult(request),JsonRequestBehavior.AllowGet);
}
其他的
返回ConvertToJson(ret.message);
}
捕获(例外情况除外)
{
ResponseMessage m=新的ResponseMessage();
m、 type=ReturnType.ERROR;
m、 text=ex.text;
返回ConvertToJson(m);
}
}
公共行动结果部分视图(Func操作)
{
//一些代码
}
公共操作结果操作(Func操作)
{
//一些代码
}
}
[海关授权]
公共类MyController:BaseController
{
公共操作结果MyEntityRead([DataSourceRequest]DataSourceRequest请求)
{
返回base.JsonDataSourceRequest(()=>
{
返回MyEntityService.GetAll();
},请求);
}
}
在这里,为了使用BaseController的函数,我总是返回 回应 或 响应消息

现在我想我可以有自定义的异常类,而不是从所有方法返回ResponseMessage,我可以抛出这些异常

我不知道这是不是一个好的做法

提前谢谢

我不知道这是不是一种好的做法


不,抛出异常来处理非异常流是糟糕的设计。抛出异常是要付出代价的,如果您能够以正常流程处理您的案例,那么您应该避免抛出异常。

如果出现异常,您应该抛出异常。如果某个条件是预期条件,则应使用返回值。只有您才能知道哪些适用于您的情况。

“抛出异常,而不是返回错误代码

异常确保不会因为调用代码未检查返回代码而忽略故障。”


非常感谢nvoigt和@darin的快速响应。您认为与项目规则相关的错误是否属于例外情况。例如,抛出usercannotbeyonger18(“”);坏吗?我应该写一句格言,比如“处理一切可以处理的事情”?非常感谢您的快速回复。您认为与项目规则相关的错误是否属于例外情况。例如,抛出usercannotbeyonger18(“”);坏吗?我是否应该有一句格言,比如“处理一切可以处理的事情”?(我在这里重复上面的问题,因为stackoverlow只有一个额外的用户错误)如果您假设您的所有数据都是有效的,并且18岁以下的人是例外情况,因为它应该已经在其他地方处理过,那么抛出一个异常。如果你的检查是第一次检查这一点,那么我不认为有一部分人是例外。18岁以下的人是很正常的,你应该找到一个正常的流量控制方法来处理这个问题。我知道了,你的答案是清楚和令人满意的,非常感谢:)