Heim >Backend-Entwicklung >PHP-Tutorial >thinkPHP 怎么处理curl异常?

thinkPHP 怎么处理curl异常?

WBOY
WBOYOriginal
2016-06-06 20:09:161378Durchsuche

PHP是怎么处理异常的?像下面这样的代码,如何得知是执行成功了还是失败了?

<code>    public function get_user($ch, $apikey) {
        \Think\Log::record('into get_user...');
        curl_setopt($ch, CURLOPT_URL, 'https://sms.xxx.com/v2/user/get.json');
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('apikey' => $apikey)));

        $response = curl_exec($ch);
        \Think\Log::record('$response : '.$response);
        if (false === $response) {
            die(curl_error);
        }
        return $response;
    }</code>

回复内容:

PHP是怎么处理异常的?像下面这样的代码,如何得知是执行成功了还是失败了?

<code>    public function get_user($ch, $apikey) {
        \Think\Log::record('into get_user...');
        curl_setopt($ch, CURLOPT_URL, 'https://sms.xxx.com/v2/user/get.json');
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('apikey' => $apikey)));

        $response = curl_exec($ch);
        \Think\Log::record('$response : '.$response);
        if (false === $response) {
            die(curl_error);
        }
        return $response;
    }</code>

<code>$apiKey = '';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://sms.yunpian.com/v2/user/get.json');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('apikey' => $apiKey)));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
$response = curl_exec($ch);
if (false === $response) {
    die(curl_error($ch));
}
print_r($response);</code>

自己运行调试吧,不解释了。

抛出异常 throw new Exception()
可能触发异常的代码 try{...}
捕获异常 catch(Exception $e){}

补充:

<code>protected function curl($url, $postFields = null)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.1)');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FAILONERROR, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//curl_setopt($ch,CURLOPT_HTTPHEADER,array('Expect:'));
if (is_array($postFields) && 0  $v)
{
if('@' != substr($v, 0, 1))//判断是不是文件上传
{
$postBodyString .= '$k=' . urlencode($v) . '&';
}
else//文件上传用multipart/form-data,否则用www-form-urlencoded
{
$postMultipart = true;
}
}
unset($k, $v);
curl_setopt($ch, CURLOPT_POST, 1);
if ($postMultipart)
{
cur l_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
}
else
{
//var_dump($postBodyString);
curl_setopt($ch, CURLOPT_POSTFIELDS, substr($postBodyString,0,-1));
}
}
$reponse = curl_exec($ch);
//return curl_getinfo($ch);
if (curl_errno($ch))
{
throw new Exception(curl_error($ch),0);
}
else
{
$httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (200 !== $httpStatusCode)
{
throw new Exception($reponse,$httpStatusCode);
}
}
curl_close($ch);
return $reponse;
}</code>

补充 @incNick 的答案,PHP 7 版本,异常 多了异常类 Error ,跟 Exception 是平级关系
可以参考
1、http://php.net/manual/zh/migration70.incompatible.php
2、http://php.net/manual/zh/language.errors.php7.php

在一个项目里面, 你很难保证curl发出的http请求一定是正确并且在超时范围内返回的..反而是经常出问题的.
所以为了项目后面的代码能正确处理curl遇到的错误, 我认为抛出异常是最好的方式.

<code class="php">$response = curl_exec($ch);
if (false === $response) {
    die(curl_error($ch));
    throw new Exception(curl_error($ch),curl_errno($ch));
}</code>

PHP 也有try catch throw吧

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn