Exception クラスを見続けたり、ステータス コードやテキストを一度にコピーしたりする必要のないシステムが必要でした。また、例外をキャッチした後も平易な英語のエラー メッセージを書き続ける必要はありませんでした。これは両方を達成しているように見え、さらに簡単な IDE オートコンプリートを可能にします!
ここにいくつかのデモコードがあります:
<?php
class Thrive_URL_Exception extends Thrive_PrettyException
{
const MISSING_CURL = "The cURL PHP extension must be enabled.";
const MISSING_URL = "A URL has not been supplied or set.";
const INVALID_URL = "The URL '%s' is not valid.";
const BLANK_URL = "The URL '%s' contained no data. It is probably invalid.";
const CONNECTION_TIMED_OUT = "The connection timed out.";
const FILE_NOT_FOUND = "404: '%s' could not be found.";
const NOT_ACCESSIBLE = "%d: '%s' is not currently accessible.";
const PERMISSION_DENIED = "Permission denied.";
}
class Thrive_URL_Downloader
{
public function fetch($url)
{
// Make sure the URL is valid.
if (!self::isURLValid($url))
{
throw new Thrive_URL_Exception(Thrive_URL_Exception::INVALID_URL, array($url));
}
$ch = curl_init();
curl_setopt_array($ch, array(CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_HEADERFUNCTION => array($this, 'captureHeader'),
CURLOPT_TIMEOUT => 30,
)
);
$data = curl_exec($ch);
curl_close($ch);
if ($data === false || is_null($data) || $data == '')
{
throw new Thrive_URL_Exception(Thrive_URL_Exception::BLANK_URL, array($url));
}
// TODO: Need to handle HTTP error messages, such as 404 and 502.
$info = $this->getUrlInfo($ch);
if ($info->httpCode == 401)
{
throw new Thrive_URL_Exception(Thrive_URL_Exception::PERMISSION_DENIED);
}
if ($info->httpCode == 404)
{
throw new Thrive_URL_Exception(Thrive_URL_Exception::FILE_NOT_FOUND, array($url));
}
if (in_array($info->httpCode, array(400, 401, 402, 403, 500, 501, 502, 503)))
{
throw new Thrive_URL_Exception(Thrive_URL_Exception::NOT_ACCESSIBLE, array($info->httpCode, $url));
}
$urlContent = new Thrive_Model_URLContent;
$urlContent->url = $url;
$urlContent->headers = $this->headers;
$urlContent->info = $info;
$urlContent->content = $data;
return $urlContent;
}
}
私の質問は、この種のことを行う明らかにより良い方法があるかどうかです??