AJAX调用的自定义PHP错误

AJAX调用的自定义PHP错误,php,jquery,ajax,Php,Jquery,Ajax,我正在构建一个web应用程序,想知道如何处理AJAX调用中的错误。例如,如果用户输入了一些无效的数据(错误的电子邮件地址,用户已经存在),我希望能够从PHP抛出一个错误 我在这里看到,您可以只使用JSON对象并处理来自JQuery成功函数的错误报告,但这似乎不是正确的方法。对我来说,当出现错误时应该使用jQuery的error函数是有意义的。我想我对那种事很固执 我现在就这么做 //In my PHP file called from JQuery function error($msg) {

我正在构建一个web应用程序,想知道如何处理AJAX调用中的错误。例如,如果用户输入了一些无效的数据(错误的电子邮件地址,用户已经存在),我希望能够从PHP抛出一个错误

我在这里看到,您可以只使用JSON对象并处理来自JQuery成功函数的错误报告,但这似乎不是正确的方法。对我来说,当出现错误时应该使用jQuery的error函数是有意义的。我想我对那种事很固执

我现在就这么做

//In my PHP file called from JQuery
function error($msg) {
    header("HTTP/1.0 555 ".$msg);
    die();
}
//Then that error is handled accordingly from JQuery
因此,我创建了一个错误代码555,它没有被定义为任何东西,并添加了我自己的自定义错误消息。这样做对吗?我应该只使用JSON吗?必须有一个标准的方式来发送这样的错误信息,对吗


如果您需要查看更多我的代码以获得更好的想法,那么整个项目都在github上:。所讨论的文件是。

我只使用一个JSON对象和一个200的HTTP头。请求本身没有任何问题,您的服务器按照预期的方式运行-错误位于不同的抽象层。

400
系列表明请求存在问题。我会将响应代码设置为400,并将错误消息列表作为JSON包含在响应正文中。

我讨厌使用HTTP状态代码来指示失败。HTTP代码应该为实际的HTTP级别错误保留,与AJAX请求相关的错误应该通过JSON结构发送回来

e、 g

然后在客户端

if (data.error) {
   alert('Request blew up: ' + data.errormessage);
}

我不同意“应该为实际的HTTP级别错误保留HTTP代码”。HTTP是一种协议,其中的状态代码反映了服务的响应。4xx响应代码应用于客户负责的问题,5xx响应代码应用于服务器负责的问题,如果我开车去商店,他们没有我想要的,我不认为这次旅行是失败的-汽车正常工作,我正确停车,我回家了-只是空手而归。AJAX服务本身的错误应该在服务响应文本中发出信号,而不是在HTTP级别。在一个“失败的”ajax调用中返回404应该意味着“嘿,服务文件丢失了”,而不是“对不起,数据库中的记录不存在”。HTTP状态代码就是这样使用的。“400错误请求”并不意味着HTTP失败。如果HTTP失败,则根本不会得到错误响应。HTTP并没有报告它自己的性能。404非常适合于说“内容不存在”,就像你可以从服务器请求一个文件,它返回404。使用常规的404,服务器仍在工作,就像AJAX调用/HTTP仍在工作一样。我建议阅读RoyFielding关于REST和HTTP在服务架构中应扮演的角色的论文。AJAX是一种通信方法。如果失败,您要么没有响应,要么在服务器处理响应失败时使用5xx级别的响应状态。在阅读了这篇非常有趣的辩论、理解并同意这两个角度后,我仍然不知道哪一个是“最佳”方法,因为它可以双向运行!!同意。对于用户可以更正的错误,请使用400错误请求(例如,他们有验证错误等)。对于数据库故障、致命错误等服务器异常,请使用500级状态代码。没有理由为此创建新的状态代码,如果是用户输入验证错误,则可以使用400。它可以被认为是一个错误的请求(比如,他们的请求主体——他们的用户输入——格式不正确)。
if (data.error) {
   alert('Request blew up: ' + data.errormessage);
}