Вход Регистрация
Файл: vendor/phpunit/phpunit/src/Framework/ExceptionWrapper.php
Строк: 158
<?php declare(strict_types=1);
/*
 * This file is part of PHPUnit.
 *
 * (c) Sebastian Bergmann <sebastian@phpunit.de>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace PHPUnitFramework;

use const 
PHP_VERSION_ID;
use function 
array_keys;
use function 
get_class;
use function 
spl_object_hash;
use 
PHPUnitUtilFilter;
use 
Throwable;
use 
WeakReference;

/**
 * Wraps Exceptions thrown by code under test.
 *
 * Re-instantiates Exceptions thrown by user-space code to retain their original
 * class names, properties, and stack traces (but without arguments).
 *
 * Unlike PHPUnitFrameworkException, the complete stack of previous Exceptions
 * is processed.
 *
 * @internal This class is not covered by the backward compatibility promise for PHPUnit
 */
final class ExceptionWrapper extends Exception
{
    
/**
     * @var string
     */
    
protected $className;

    
/**
     * @var null|ExceptionWrapper
     */
    
protected $previous;

    
/**
     * @var null|WeakReference<Throwable>
     */
    
private $originalException;

    public function 
__construct(Throwable $t)
    {
        
// PDOException::getCode() is a string.
        // @see https://php.net/manual/en/class.pdoexception.php#95812
        
parent::__construct($t->getMessage(), (int) $t->getCode());

        
$this->setOriginalException($t);
    }

    public function 
__toString(): string
    
{
        
$string TestFailure::exceptionToString($this);

        if (
$trace Filter::getFilteredStacktrace($this)) {
            
$string .= "n" $trace;
        }

        if (
$this->previous) {
            
$string .= "nCaused byn" $this->previous;
        }

        return 
$string;
    }

    public function 
getClassName(): string
    
{
        return 
$this->className;
    }

    public function 
getPreviousWrapped(): ?self
    
{
        return 
$this->previous;
    }

    public function 
setClassName(string $className): void
    
{
        
$this->className $className;
    }

    public function 
setOriginalException(Throwable $t): void
    
{
        
$this->originalException($t);

        
$this->className get_class($t);
        
$this->file      $t->getFile();
        
$this->line      $t->getLine();

        
$this->serializableTrace $t->getTrace();

        foreach (
array_keys($this->serializableTrace) as $key) {
            unset(
$this->serializableTrace[$key]['args']);
        }

        if (
$t->getPrevious()) {
            
$this->previous = new self($t->getPrevious());
        }
    }

    public function 
getOriginalException(): ?Throwable
    
{
        return 
$this->originalException();
    }

    
/**
     * Method to contain static originalException to exclude it from stacktrace to prevent the stacktrace contents,
     * which can be quite big, from being garbage-collected, thus blocking memory until shutdown.
     *
     * Approach works both for var_dump() and var_export() and print_r().
     */
    
private function originalException(Throwable $exceptionToStore null): ?Throwable
    
{
        
// drop once PHP 7.3 support is removed
        
if (PHP_VERSION_ID 70400) {
            static 
$originalExceptions;

            
$instanceId spl_object_hash($this);

            if (
$exceptionToStore) {
                
$originalExceptions[$instanceId] = $exceptionToStore;
            }

            return 
$originalExceptions[$instanceId] ?? null;
        }

        if (
$exceptionToStore) {
            
$this->originalException WeakReference::create($exceptionToStore);
        }

        return 
$this->originalException !== null $this->originalException->get() : null;
    }
}
Онлайн: 0
Реклама