如何在 AJAX 错误方法中检索 DbContext SqlException



假设我有一个在向数据库列添加值时不遵守的检查约束,或者假设我有一个将RAISEERROR与自定义消息一起使用的触发器。

在我的 WebMethod 中,我使用 SqlException 在更新数据库时捕获任何错误。因此,如果不遵守检查约束,我应该能够检索自动 SQL Server 错误消息,或者如果触发器正确引发错误消息,我应该能够检索我的自定义消息?

我该怎么做?

以下是我尝试过的:

[WebMethod]
public string AddData(entity e)
{
   using(var context = new DB_ENTITY_DbContext())
   {
       try
       {
           context.entity.Add(e);
           context.SaveChanges();
           return "success";
       }
       catch(SqlException ex)
       {
           return "My custom message " + ex.Message;
       }
   }
}

脚本代码

function AddData()
{
    $.ajax({
    // Some other settings
    error: function (xhr, status, error){
            alert(JSON.parse(xhr.responseText).Message);
            alert(error);
        }    
    });
}

此处错误不返回

"我的自定义消息.....(和一些自动生成的消息("....

它返回"内部服务器错误"..

知道我应该做什么吗?

这是因为您正在捕获异常,并返回一个简单的字符串。从理论上讲,您的WebMethod永远不会失败...(它失败,但您指示 WebMethod 从不通知异常(。这就是为什么你的 ajax 调用永远不会到达错误函数。

通过捕获异常来封装和隐藏错误是一个坏主意。封装并抛出不同的异常,或者只是简单地删除try/catch块

控制器

public class ClientErrorHandler : FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext)
        {
            var response = filterContext.RequestContext.HttpContext.Response;
            response.Write(filterContext.Exception.Message);
            response.ContentType = MediaTypeNames.Text.Plain;
            filterContext.ExceptionHandled = true;
        }
    }
    [ClientErrorHandler]
    public class SomeController : Controller
    {
        [HttpPost]
        public ActionResult SomeAction()
        {
            throw new Exception("Error message");
        }
    }

查看脚本:

$.ajax({
    type: "post", url: "/SomeController/SomeAction",
    success: function (data, text) {
        //...
    },
    error: function (request, status, error) {
        alert(request.responseText);
    }
});

最新更新