The error raised by negative expiry times should be E_RECOVERABLE_ERROR instead of E_ERROR, based on discussion in #libcouchbase. Operationally they have the same effect (fatal error), but the former can be caught by user-defined error handler functions. That is handy for example in testing.
Per discussion with Mark, this should be a child of http://review.couchbase.org/#/c/21236/ when the changeset is developed.
(This is a one-line change in the _check_expiry function, changing the error code given to php_error.)