我在本地主机运行时遇到此错误,如果互联网断开连接(如果互联网连接正常)我想处理此错误,“错误可以显示”但是想要处理PHP上不致命的错误中断页。
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]:
php_network_getaddresses: getaddrinfo failed: No such host is known.
in F:\xampp\htdocs\shoptpoint\sections\docType_head_index.php on line 30
但我正在尝试使用try-catch处理。以下是我的代码
$apiurl="http://publisher.usb.api.shopping.com/publisher/3.0/rest/GeneralSearch?apiKey=78b0db8a-0ee1-4939-a2f9-d3cd95ec0fcc&trackingId=7000610&categoryId='5855855'";
try{
new SimpleXMLElement($apiurl,null, true);
}catch(Exception $e){
echo $e->getMessage();
}
如何处理错误,我的页面可以执行项目结束?
答案 0 :(得分:6)
使用set_error_handler,您可以执行以下操作,将SimpleXMLElement引发的任何通知/警告转换为可捕获的异常。
采取以下措施: -
<?php
function getData() {
return new SimpleXMLElement('http://10.0.1.1', null, true);
}
$xml = getData();
/*
PHP Warning: SimpleXMLElement::__construct(http://10.0.1.1): failed to open stream: Operation timed out
PHP Warning: SimpleXMLElement::__construct(): I/O warning : failed to load external entity "http://10.0.1.1"
PHP Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML'
*/
在抛出SimpleXMLElement异常之前,看看我们如何得到2个警告?好吧,我们可以将它们转换成这样的例外: -
<?php
function getData() {
set_error_handler(function($errno, $errstr, $errfile, $errline) {
throw new Exception($errstr, $errno);
});
try {
$xml = new SimpleXMLElement('http://10.0.1.1', null, true);
}catch(Exception $e) {
restore_error_handler();
throw $e;
}
return $xml;
}
$xml = getData();
/*
PHP Fatal error: Uncaught exception 'Exception' with message 'SimpleXMLElement::__construct(http://10.0.1.1): failed to open stream: Operation timed out'
*/
祝你好运,
安东尼。
答案 1 :(得分:0)
如果出于某种原因您不想设置错误处理程序,则还可以使用一些libxml函数来抑制E_WARNING
引发:
// remembers the old setting and enables usage of libxml internal error handler
$previousSetting = libxml_use_internal_errors(true);
// still need to try/catch because invalid XML raises an Exception
try {
// XML is missing root node
new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?>',null, true);
} catch(Exception $e) {
echo $e->getMessage(); // this won't help much: String could not be parsed as XML
$xmlError = libxml_get_last_error(); // returns object of class LibXMLError or FALSE
if ($xmlError) {
echo $xmlError->message; // this is more helpful: Start tag expected, '<' not found
}
}
// sets libxml usage of internal error handler to previous setting
libxml_use_internal_errors($previousSetting);
或者,您可以使用libxml_get_errors()
代替libxml_get_last_error()
来获取所有错误。有了它,您可以获得有关将XML解析为LibXMLError
对象数组的所有错误。
一些有用的链接: