try {
token = nonNullListener.preInvoke(proxy, method, args);
inInvoke = true;
result = method.invoke(target.call(), args);
inInvoke = false;
nonNullListener.postInvoke(token, proxy, method, result);
} catch (Throwable e) {
// whether the the exception is an error is an application decision
// if we catch an exception we decide carefully which one to
// throw onwards