2013-11-09 3 views
1

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

function assert_foo(){ 
    throw new CustomException(); 
} 

/* ... */ 

assert_foo(); // <-- I want the exception to seem to originate from here */ 

assert_foo функция будет использоваться только для тестирования коды, где тест рамка только показывает место, где исключение было инициировано из и не в полном стеке вызовов. Единственной логикой в ​​assert_foo является проверка состояния.

Я попытался переопределить Exception :: getTrace, но Cannot override final method Exception::getTrace().

+0

Это невозможно, и если вам это нужно, чтобы что-то сделать (что?), то вы взяли неправильный путь. Возможно, 'if (! Assert_foo()) генерирует новый CustomException()'? – Jon

+0

Нет, я искренне сомневаюсь в этом. Наличие ваших утверждений вызывает исключения - это довольно сумасшедшее поведение; они должны полностью прекратить выполнение, а не поднимать глотательные исключения, которые могут быть пойманы и проигнорированы. Вы хотите встроенный 'assert'. – meagar

+0

Вы можете поймать свое исключение, в котором вызывается assert_foo, и отбросить произвольное выполнение оттуда, чтобы устранить то, что вы хотите достичь. – Artur

ответ

1

Изменить это:

function assert_foo() 
{ 
    throw new CustomException(); 
} 

/* ... */ 

assert_foo(); 

к:

function assert_foo() 
{ 
    throw new CustomException(); 
} 

/* ... */ 

try 
{ 
    assert_foo(); //AAA 
} 
catch(CustomException $ce) 
{ 
    // create new and throw from here 
    throw new CustomException(); 
} 

теперь у вас есть то, что вы хотели есть. ваше исключение будет выглядеть так, как если бы оно произошло от AAA line

+0

Я думаю, это сработало бы, но немного утомительно, чем я надеялся. – ext

+0

Это именно то, что вы хотели и просили ;-). Возможно, вам это не понадобится, поскольку я не знаю контекста, но все. – Artur

+0

Да, вы правы. Я надеялся на что-то волшебное, чтобы решить это, не исправляя рамки, чтобы показать полный стол. – ext

Смежные вопросы