Получите контекст исключения в PHP

Также обратите внимание, что Вы не можете сериализировать средства управления пользовательским интерфейсом и что любой объект, который Вы хотите передать на буфер обмена, должен быть сериализуемым иначе, это не может быть передано через другим процессам.

5
задан Bart van Heukelom 27 November 2009 в 15:56
поделиться

3 ответа

Вы можете вручную привязать контекст к своему исключению. Я никогда не пробовал, но было бы интересно создать собственное исключение, которое в конструкторе вызывает и сохраняет get_defined_vars () для последующего извлечения.
Это будет серьезным исключением: -)

доказательство концепции:

class MyException extends Exception()  {
    protected $throwState;

    function __construct()   {
        $this->throwState = get_defined_vars();
        parent::__construct();
    }

    function getState()   {
        return $this->throwState;
    }
}

даже лучше:

class MyException extends Exception implements IStatefullException()  {
    protected $throwState;

    function __construct()   {
        $this->throwState = get_defined_vars();
        parent::__construct();
    }

    function getState()   {
        return $this->throwState;
    }

    function setState($state)   {
        $this->throwState = $state;
        return $this;
    }
}

interface  IStatefullException { function getState(); 
      function setState(array $state); }


$exception = new MyException();
throw $exception->setState(get_defined_vars());
8
ответ дан 13 December 2019 в 05:36
поделиться

Исключения в PHP:

http://www.php.net/manual/ ru / language.exceptions.exnding.php

Методы базового класса Exception:

final public  function getMessage();        // message of exception
final public  function getCode();           // code of exception
final public  function getFile();           // source filename
final public  function getLine();           // source line
final public  function getTrace();          // an array of the backtrace()
final public  function getPrevious();       // previous exception
final public  function getTraceAsString();  // formatted string of trace

Итак, это то, с чем вам придется работать, если вы поймали базовое исключение. Если у вас нет контроля над кодом, который генерирует исключение, то для получения какого-либо дополнительного контекста мало что нужно сделать, поскольку контекст, в котором оно было создано, исчезнет к тому времени, когда вы его поймаете. Если вы сами генерируете исключение, вы можете присоединить контекст к исключению до его создания.

2
ответ дан 13 December 2019 в 05:36
поделиться

Любое решение, которое я могу себе представить, не вводя вид с нуля, использует индексы, или дикт, или что-то еще, что действительно не способно сохранить вам память. В любом случае использование застежек -молний увеличит использование памяти только на постоянный коэффициент, поэтому стоит убедиться, что это действительно проблема перед решением.

Если это действительно становится проблемой, могут быть более эффективные решения. Поскольку элементы foo и bar так тесно связаны, уверены ли вы, что их правильное представление не является списком кортежей? Вы уверены, что они не должны находиться в более компактной структуре данных, если вам не хватает памяти, например числового массива или базы данных (последний из которых действительно хорош в такого рода манипуляциях)?

(Также, кстати, itertools.izip может сэкономить вам немного памяти над застежками -молниями , хотя в результате сортировки вы все еще получаете полный список в виде списка)

-121--4321004-

По моему опыту, R является исключительно мощным языком в этих областях:

  1. Манипуляция и преобразование данных.

  2. Статистический анализ.

  3. Графика.

Но R ни в коем случае не является тройным пони. Я также применил этот язык к задачам, которые не полностью вписываются в вышеуказанные категории. Некоторые примеры:

  • Сценарий, помогающий в создании универсальных двоичных файлов OSX путем идентификации и сопоставления статических и динамических библиотек различных архитектур и последующего запуска результирующих групп через lipo .

  • Скрипты для удаления информации с веб-страниц.

  • Набор сценариев для создания изображений с географической привязкой, разрезания изображений на наборы с помощью GDAL , формирования манифеста JSON , описывающего выходные данные, и загрузки результата на веб-сайт для немедленного дисплея с помощью OpenLayers .

Моя любимая часть использования R - это частота, с которой я могу сказать:

WHOA! Есть пакет, который делает ЭТО?!

-121--2066718-

Не могли бы вы также сделать:

class ContextException extends Exception {

    public $context;

    public function __construct($message = null, $code = 0, Exception $previous = null, $context=null) {
        parent::__construct($message, $code, $previous);
        $this->context = $context;
    }

    public function getContext() {
        return $this->context;
    }
}

Это позволило бы избежать необходимости создания экземпляра исключения, а затем выбросить его.

2
ответ дан 13 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: