goto &$name effectively removes the calling block from the call stack. With the eval block gone, how would you trap errors (it won't even return anything)? Pick one: have the eval block in the call stack (and then use &$f;), or don't try to trap errors.