我正在记录我的OnException方法中发生的所有错误.
如何查找发生错误的控制器/操作?
我们使用存储过程在数据库中实现大多数业务规则.
我永远无法决定如何最好地将数据约束违规错误从数据库传递回用户界面.我所谈论的约束更多地依赖于业务规则而不是数据完整性.
例如,诸如"无法插入重复键行"之类的db错误与业务规则"您不能具有多个具有相同名称的Foo"相同.但是我们已经在最常识的位置"实现"了它:作为一个唯一的约束,当规则被违反时抛出异常.
其他规则,例如"你每天只允许100个Foos"不会导致错误,因为它们由自定义代码优雅地处理,例如return empty dataset应用程序代码检查并传递回ui层.
这就是问题所在.我们的ui代码看起来像这样(这是AJAX.NET webservices代码,但任何ajax框架都可以):
WebService.AddFoo("foo", onComplete, onError); // ajax call to web service
function onComplete(newFooId) {
if(!newFooId) {
alert('You reached your max number of Foos for the day')
return
}
// update ui as normal here
}
function onError(e) {
if(e.get_message().indexOf('duplicate key')) {
alert('A Foo with that name already exists');
return;
}
// REAL error handling code here
}
Run Code Online (Sandbox Code Playgroud)
(作为旁注:我注意到这是stackoverflow在您提交评论过快时所执行的操作:服务器生成HTTP 500响应并且ui捕获它.)
所以你看,我们在这里处理两个地方的业务规则违规,其中一个(即唯一的constaint错误)作为特殊情况处理,应该处理真正的错误(而不是违反业务规则),因为.NET将Exceptions一直传播到onError()处理程序.
这感觉不对.我认为我的选择是:
$.ajax({
type: 'POST',
url: api_url+'client/'+client.id+'.json',
data: {
_method: 'delete',
id: client.id
},
success: function(data) {
$('#delete-client').html('Success');
},
error: function(data) {
$('#delete-client').css('color', 'red');
$('#delete-client').html('Error');
}
});
Run Code Online (Sandbox Code Playgroud)
在错误:函数jquery将接收具有500头状态的这个json对象
{"errors":{"code":777,"message":"Method requested does not yet exist","data":[]}}
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用data.errors.message它不会显示错误.当我在console.log中使用返回对象时,它会在chromes开发框中显示一个包含不同事件的巨大对象
固定
var error = jQuery.parseJSON(jqXHR.responseText);
$('#delete-client').html(error.errors.message);
Run Code Online (Sandbox Code Playgroud)