假设我有一个在向数据库列添加值时不遵守的检查约束,或者假设我有一个将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);
}
});