当前位置: 首页 > 面试题库 >

使用file_get_contents进行良好的错误处理

邹祺
2023-03-14
问题内容

我正在使用具有以下功能的simplehtmldom:

// get html dom form file
function file_get_html() {
    $dom = new simple_html_dom;
    $args = func_get_args();
    $dom->load(call_user_func_array('file_get_contents', $args), true);
    return $dom;
}

我这样使用它:

$html3 = file_get_html(urlencode(trim("$link")));

有时,URL可能只是无效的,我想对此进行处理。我以为我可以使用try and catch,但是这没有用,因为它不会抛出异常,它只是给出了这样的php警告:

[06-Aug-2010 19:59:42] PHP Warning:  file_get_contents(http://new.mysite.com/ghs 1/) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found  in /home/example/public_html/other/simple_html_dom.php on line 39

第39行在上面的代码中。

我如何正确处理此错误,我可以只使用普通if条件,它看起来不像返回布尔值。

谢谢大家的帮助

更新资料

这是一个好的解决方案吗?

if(fopen(urlencode(trim("$next_url")), 'r')){

    $html3 = file_get_html(urlencode(trim("$next_url")));

}else{
    //do other stuff, error_logging
    return false;

}

问题答案:

这是一个主意:

function fget_contents() {
    $args = func_get_args();
    // the @ can be removed if you lower error_reporting level
    $contents = @call_user_func_array('file_get_contents', $args);

    if ($contents === false) {
        throw new Exception('Failed to open ' . $file);
    } else {
        return $contents;
    }
}

基本上是的包装器file_get_contents。失败将引发异常。为了避免不得不覆盖file_get_contents自身,您可以

// change this
$dom->load(call_user_func_array('file_get_contents', $args), true); 
// to
$dom->load(call_user_func_array('fget_contents', $args), true);

现在你可以:

try {
    $html3 = file_get_html(trim("$link")); 
} catch (Exception $e) {
    // handle error here
}

错误抑制(通过使用@或通过降低error_reporting级别是一种 有效的
解决方案。这可能引发异常,您可以使用它来处理错误。有很多原因file_get_contents可能会生成警告,PHP手册本身建议降低error_reporting:请参见手册



 类似资料:
  • 我希望以这样一种方式设计API调用,即从一个地方轻松处理成功和失败响应(而不是为所有API编写相同的调用函数代码) null apiInterface.java-它是一个包含不同API调用定义的接口。 apiclient.java-获取referfit客户机对象来调用API。 apimanager.java--它有调用API并解析其响应的方法。 apiInterface.java apiclien

  • Promise 链在错误(error)处理中十分强大。当一个 promise 被 reject 时,控制权将移交至最近的 rejection 处理程序(handler)。这在实际开发中非常方便。 例如,下面代码中所 fetch 的 URL 是错的(没有这个网站),.catch 对这个 error 进行了处理: fetch('https://no-such-server.blabla') // re

  • 问题内容: 使用错误返回码进行参数验证是否被视为良好做法?我的意思是有人应该在哪里使用错误而不是恐慌(有任何指导方针吗?)。 例如: 检查非nil +是否返回错误(如果为nil)是一个好习惯? 或检查正确的整数范围等。 我认为使用错误会使Go变得非常C-ish,并且看起来很糟糕。在这种情况下,恐慌是一个不错的选择吗? 还是Gopher应该使用Python / Ruby / JS方法“只是让它失败”

  • 问题内容: 我一直在努力解决ECMAScript 5中引入的新方法。 通常,当我想使用继承时,我会执行以下操作: 我只是将一个新创建的Animal对象分配给Dog的原型,一切都像一个吊饰一样工作: 但是人们(没有解释)说这不是继承的工作方式,我应该使用Object.create方法: 这也有效。 使用有什么好处,或者我错过了什么? 更新:有人说也可以。所以现在我很困惑 问题答案: 在下面的内容中,

  • 问题内容: 我在Swift中使用,需要获取更好的错误消息。 在调试描述中(例如),我可以看到诸如“给定数据不是有效的JSON”之类的消息,但是我需要知道的是,而不是网络错误(例如)。 我尝试将其强制转换为,但这似乎并未显示更多信息。我当然不需要字符串-甚至错误代码也比这有用得多… 问题答案: 切勿在解码块中打印。这将返回一个毫无意义的通用错误消息。始终打印实例。然后,您会得到所需的信息。 或针对

  • 本文向大家介绍使用Raygun对Node.js应用进行错误处理的方法,包括了使用Raygun对Node.js应用进行错误处理的方法的使用技巧和注意事项,需要的朋友参考一下 用我们的 raygun4node 包,能提供一种把您的Node.js错误发送给Raygun的便利办法. 它可以很容仪的使用 npm 安装:   其能给您提供一个raygun客户端,您可以用它来配置您的API key,并且可以用来