【问题标题】:Use try-catch-finally block in Javascript to capture JSON parsing exception doesn't work在 Javascript 中使用 try-catch-finally 块捕获 JSON 解析异常不起作用
【发布时间】:2017-12-16 00:53:12
【问题描述】:

我对网络脚本有些陌生。我习惯了 Java 的 try-catch 风格,而 Javascript 的风格似乎很相似。但是,当我尝试使用它时,我得到的结果并不完全相同。 这是我的 try-catch 块:

try {
    loadAllInfo(<?php echo get_students_from_group();?>);
} catch (exception) {
    alert("Invalid data entered, please try again.");
    window.location.href = "studentDisplayFromService.php";
} finally {
    setHTMLStudentTable("all");
}

目的是如果 PHP 请求失败(输入需要有非常特定的语法,但在这种情况下,无法事先检查),这会将用户带回输入网站,因为PHP 请求发回无法解析为 JSON 的内容。 当语法正确时,我的代码可以完美运行,但当语法不正确时,它不会捕获异常,而是显示在控制台上:

SyntaxError: expected expression, got '

我曾尝试自己在 try 块中抛出异常,例如...

try {
    loadAllInfo(<?php echo get_students_from_group();?>);
    throw new exception("Error");
}

...在这种情况下它会捕获它,显示警报并将用户带回原始网站。

知道什么可能导致此问题或如何解决它吗?我在这里找不到任何类似的问题:/

非常感谢您!

【问题讨论】:

  • 当你 echo json_encode($arr) 你不应该 JSON.parse 它。输出不会有引号以使其成为字符串,因此它已经表示 javascript 编译器中的 javascript 数组或对象
  • 谢谢,但我也试过了,但问题仍然存在:/
  • 查看页面源代码。怀疑它没有完全按照您的期望打印。或者问题不在显示的代码中
  • 或者这个代码在 php 文件中不存在,而你试图在 js 文件中运行它
  • 好的。我是这么想的。改为发出 cURL 请求。您可以访问远程状态和内容类型标头,如果出现下面评论中显示的错误,则为 500 服务器错误状态,如果它是 json,则将具有 application/json 内容类型(至少应该如此)。一个好的请求库是 Guzzle

标签: javascript php json try-catch


【解决方案1】:

你需要这样写:

JSON.parse('<?php echo json_encode(get_students_from_group());?>')

可以在此处找到一些示例和详细说明: JSON.parse

如果你得到不好的结果,你可能需要检查它在你的 loadAllInfo() 函数中是否有效。

在尝试在 Js 中执行某些操作之前,最好在 PHP 函数 get_students_from_group() 中捕获该错误。 正如您在 cmets 中提到的,您会收到 400 状态代码作为响应。所以试着抓住它。成功调用通常会返回 200 http 状态码。

如果你需要使用 file_get_contents() 你可以查看$http_response_header

最好使用cUrl 进行更多控制:

<?php
$ch = curl_init('http://...');
curl_exec($ch);
if (!curl_errno($ch)) {
    $info = curl_getinfo($ch); // ... Process information
}
curl_close($ch);
?>

【讨论】:

  • 我在编辑中从问题中删除了 JSON 解析,恐怕这不是解决方案,它返回的 '
  • 它返回的内容如下所示:
    警告:file_get_contents(homepages.herts.ac.uk/%7Ecomqgrs/ads/…):打开流失败:HTTP 请求失败! /Applications/XAMPP/xamppfiles/htdocs/ADS/coursework/showStudentList.php 11
    行中的 HTTP/1.1 400 错误请求
  • @DanielG 您需要在问题中的步骤之前很久就发现该错误
  • 你能展示一下你的 loadAllInfo() 是什么样的吗?
  • 当然:function loadAllInfo(moduleObject) { loadModuleInfo(moduleObject); loadStudentInfo(moduleObject); loadGroupInfo(moduleObject); } function loadModuleInfo(moduleObject) { moduleCode = moduleObject["code"]; moduleName = moduleObject["name"]; moduleCohort = moduleObject["cohort"]; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
相关资源
最近更新 更多