我有一个前端登录页面,旨在解析JSON消息。它的逻辑是:
$(document).ready(function() {
$('#form_login').ajaxForm(function(response) {
$("#content").html(response.message);
if(response.result == 0) {
window.setTimeout(function() {
window.location.href = response.lnkmember;
}, 2000);
}
});
});
问题是如果后端PHP中存在拼写错误或错误,则前端无法显示这些错误或通知用户。它看起来很悬,但是当我在Chrome上打开开发工具时,我可以看到以下网络数据确实被转回。
<br />
<b>Notice</b>: Undefined variable: email_support in <b>technical\public_html\email.php</b> on line <b>57</b><br />
Mailer Error: You must provide at least one recipient email address.
{"result":"2", "message":"An internal error occurred. Our technical staff has been informed to fix this. Sorry for any inconvenience."}
在后端,我确实使用了try-catch逻辑,并返回一个非零字段&#39;结果&#39;在JSON回复中。但是如果php错误是在json消息之前,那么前端就不高兴了。
最满意的解决方案是将PHP错误发送给技术支持,同时仅向用户显示我的JSON消息。但我不知道如何实现这一目标。那你可以帮帮我吗?
答案 0 :(得分:0)
您需要明确捕获自己的错误消息,我会尝试将错误的JSON作为字符串传回客户端:
$(document).ready(function() {
$('#form_login').ajaxForm(function(response) {
if ( response.result == 2 ) {
// handle error
console.log(response.message);
console.log(response.originalJSON);
} else {
$("#content").html(response.message);
if(response.result == 0) {
window.setTimeout(function() {
window.location.href = response.lnkmember;
}, 2000);
}
}
});
});
与消息一起,您传回发送的JSON字符串:
{"result":"2",
"message":"An internal error occurred. Our technical staff has been informed to fix this. Sorry for any inconvenience."
"originalJSON":" .... stringyfied JSON from the PHP ...." }
修改强> 在PHP方面,您可能会以这种方式捕获JSON错误:
$json_parsed = json_decode($json_string, true);
if ( hasJSONerror() !== false )
{
// output json_string
return;
}
....
function hasJSONerror()
{
// Define the possible JSON errors.
$json_errors = array(
JSON_ERROR_NONE => 'No error has occurred',
JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
JSON_ERROR_SYNTAX => 'Syntax error',
JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded'
);
if ( json_last_error() != 0 )
{
return json_last_error();
}
return false;
}
答案 1 :(得分:0)
由于PHP中的响应解析警告或通知的实际困难(实际错误会导致500响应标题,这很容易捕获),我个人对生产的看法是实际告诉PHP禁用所有显示的警告对于这个页面。
所以,在这个PHP脚本的顶部,添加:
error_reporting(E_NONE);
ini_set('display_errors', 0);
这将禁用此页面的PHP输出错误,允许您处理它们。
请注意:更好地 ,只需确保生产中不会出现此类警告!如果您觉得无法处理(不应该),那么您可以使用@
符号来沉默PHP。