1

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;
    }
}

私の質問は、この種のことを行う明らかにより良い方法があるかどうかです??

4

1 に答える 1

2

私見それは最善の解決策ではありません。

あなたの例外クラスは、Single Responsibility Principle (SRP)に違反しています Wikipedia、さまざまな種類のエラーに同じ例外クラスを使用しているため。私がすることは次のとおりです。

さまざまな種類のエラーに対して単一の例外クラスを作成します。

 InvalidUrlException
 PermissionDeniedException
 FileNotFoundException (probalny this exception exists in core php)

その後、メッセージを渡さずに excetion を使用できます。メッセージはクラスのプライベート部分です。

より大きなアプリケーションの場合、このソリューションは私見の方が優れています。

于 2012-06-19T17:30:29.313 に答える