Также обратите внимание, что Вы не можете сериализировать средства управления пользовательским интерфейсом и что любой объект, который Вы хотите передать на буфер обмена, должен быть сериализуемым иначе, это не может быть передано через другим процессам.
Вы можете вручную привязать контекст к своему исключению. Я никогда не пробовал, но было бы интересно создать собственное исключение, которое в конструкторе вызывает и сохраняет 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());
Исключения в 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
Итак, это то, с чем вам придется работать, если вы поймали базовое исключение. Если у вас нет контроля над кодом, который генерирует исключение, то для получения какого-либо дополнительного контекста мало что нужно сделать, поскольку контекст, в котором оно было создано, исчезнет к тому времени, когда вы его поймаете. Если вы сами генерируете исключение, вы можете присоединить контекст к исключению до его создания.
Любое решение, которое я могу себе представить, не вводя вид с нуля, использует индексы, или дикт, или что-то еще, что действительно не способно сохранить вам память. В любом случае использование застежек -молний
увеличит использование памяти только на постоянный коэффициент, поэтому стоит убедиться, что это действительно проблема перед решением.
Если это действительно становится проблемой, могут быть более эффективные решения. Поскольку элементы foo
и bar
так тесно связаны, уверены ли вы, что их правильное представление не является списком кортежей? Вы уверены, что они не должны находиться в более компактной структуре данных, если вам не хватает памяти, например числового массива или базы данных (последний из которых действительно хорош в такого рода манипуляциях)?
(Также, кстати, itertools.izip
может сэкономить вам немного памяти над застежками -молниями
, хотя в результате сортировки вы все еще получаете полный список в виде списка)
По моему опыту, R
является исключительно мощным языком в этих областях:
Манипуляция и преобразование данных.
Статистический анализ.
Графика.
Но R
ни в коем случае не является тройным пони. Я также применил этот язык к задачам, которые не полностью вписываются в вышеуказанные категории. Некоторые примеры:
Сценарий, помогающий в создании универсальных двоичных файлов OSX путем идентификации и сопоставления статических и динамических библиотек различных архитектур и последующего запуска результирующих групп через lipo
.
Скрипты для удаления информации с веб-страниц.
Набор сценариев для создания изображений с географической привязкой, разрезания изображений на наборы с помощью GDAL
, формирования манифеста JSON
, описывающего выходные данные, и загрузки результата на веб-сайт для немедленного дисплея с помощью OpenLayers
.
Моя любимая часть использования R
- это частота, с которой я могу сказать:
-121--2066718-WHOA! Есть пакет, который делает ЭТО?!
Не могли бы вы также сделать:
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;
}
}
Это позволило бы избежать необходимости создания экземпляра исключения, а затем выбросить его.