PHP로 예외를 던지는 방법이 아니라 예외를 만드는 유일한 이유입니다.

12620 단어 PHP
예외적으로 제작에 번거로운 수속이 필요할 때.예를 들어, HTTP 기반 응답 객체가 예외를 만들 경우
<?php
$message = sprintf(
    "HTTP/%s %s %s",
    $response->getVersion(),
    $response->getCode(),
    $response->getMessage()
);

throw new HttpException($message, $response->getCode());
그럴 때 그런 방법을 만들면 편해요.
이때 제작 예외 투척 방법과 제작 예외 귀환 방법 두 가지 실시 방법을 고려할 수 있다.예를 들면 다음과 같은raisecreate.
<?php
class HttpException extends \Exception
{
    /**
     * 例外を作成して投げるメソッド
     *
     * @param $response HttpResponse
     * @throws HttpException
     */
    public static function raise(HttpResponse $response)
    {
        $message = sprintf(
            "HTTP/%s %s %s",
            $response->getVersion(),
            $response->getCode(),
            $response->getMessage()
        );

        throw new HttpException($message, $response->getCode());
    }

    /**
     * 例外を作成するメソッド
     *
     * @param $response HttpResponse
     * @return HttpException
     */
    public static function create(HttpResponse $response)
    {
        $message = sprintf(
            "HTTP/%s %s %s",
            $response->getVersion(),
            $response->getCode(),
            $response->getMessage()
        );

        return new HttpException($message, $response->getCode());
    }
}
(이 예라면 구조기를 말하면 되는 것도 아니기 때문에 예가 맞지 않을 수도 있다.)
저는 개인적으로 예외를 만들고 던지는 방법을 많이 사용하지만 생각한 부분이 있어서 가능한 예외로 만들고 돌아오는 방법이 아닐까 싶습니다.

까닭


다음은 예외를 만들고 예외를 만들어 돌아오는 방법의 반입니다.
<?php
namespace App;

class Exception extends \Exception
{
    /**
     * @param $message
     * @throws Exception
     */
    public static function raise($message)
    {
        throw new static($message);
    }

    /**
     * @param $message
     * @return Exception
     */
    public static function create($message)
    {
        return new static($message);
    }
}
?>
아래와 같이 사용한다.
<?php
namespace App;

class Sample
{
    public function test1($val)
    {
        if ($val == false) {
            Exception::raise("oops!");
        }
    }

    public function test2($val)
    {
        if ($val == false) {
            throw Exception::create("oops!");
        }
    }
}
?>
이 테스트는 아래와 같다.
<?php
namespace Tests;

use App\Sample;
use App\Exception;

class SampleTest extends \PHPUnit_Framework_TestCase
{
    public function test1_ok()
    {
        (new Sample())->test1(true);
    }

    public function test1_err()
    {
        $this->setExpectedException(Exception::class, "oops!");
        (new Sample())->test1(false);
    }

    public function test2_ok()
    {
        (new Sample())->test2(true);
    }

    public function test2_err()
    {
        $this->setExpectedException(Exception::class, "oops!");
        (new Sample())->test2(false);
    }
}
?>
어떻게 된 거야?

예외를 만들어 되돌리는 방법을 사용할 때 예외의 다음 줄은 사선으로 간주되고, 예외를 만들어 던지는 방법은 실행되지 않은 줄로 간주된다.
아래처럼 @codeCoverageIgnore사용하면 커버를 무시할 수 있지만 하나씩 쓰는 것도 번거롭다.
<?php
namespace App;

class Sample
{
    public function test1($val)
    {
        if ($val == false) {
            Exception::raise("oops!");
        } // @codeCoverageIgnore
    }

    public function test2($val)
    {
        if ($val == false) {
            throw Exception::create("oops!");
        }
    }
}
?>

최후


나는 억지로 C0 덮개를 100% 녹일 필요도 없고, 그렇게 구애받을 필요도 없다고 생각한다. 과연 무엇이든지 다 된다.
또 어떤 방법이든 예외적인 창고 추적은 한 단계 깊어진다.PHP는 예외new일 때 스택 추적입니다.
다른 언어(C# 아니요?)이렇게 되면 new가 아닌 throw 했을 때의 스택 스토킹인 것 같고, 예외를 만들어 던지는 방법보다 예외를 만들어 되돌리는 방법으로 사람을 부르는 것throw은 보상을 받는 것 같다.

좋은 웹페이지 즐겨찾기