时间:2021-07-01 10:21:17 帮助过:27人阅读
- <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 < count($postFields))
- {
- $postBodyString = '';
- $postMultipart = false;
- foreach ($postFields as $k => $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.com/manual/zh/migration70.incompatible.php
2、http://php.com/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吧