Php OOP:如何向异常添加自动上下文

Php OOP:如何向异常添加自动上下文,php,oop,exception,Php,Oop,Exception,我有一个类,它在构造函数中接收一些初始化值,并使用它们实现接口。我的代码从这个类中创建了几个具有不同初始化值的对象 每当其中一个方法中发生异常时,stacktrace将显示哪个类和方法引发了异常,而不是哪个对象引发了异常 因此,我想用一些附加信息来包装每个离开类的异常,包括对象在其构造函数中接收到的原始初始化值。这应该发生在我自己抛出的异常(这很平常)和运行时(如NPE)以及我的类使用的库抛出的异常上 当然,我可以用try/catch包装每个公共方法: public function whate

我有一个类,它在构造函数中接收一些初始化值,并使用它们实现接口。我的代码从这个类中创建了几个具有不同初始化值的对象

每当其中一个方法中发生异常时,stacktrace将显示哪个类和方法引发了异常,而不是哪个对象引发了异常

因此,我想用一些附加信息来包装每个离开类的异常,包括对象在其构造函数中接收到的原始初始化值。这应该发生在我自己抛出的异常(这很平常)和运行时(如NPE)以及我的类使用的库抛出的异常上

当然,我可以用try/catch包装每个公共方法:

public function whatever(...)
{
    try {

        // ...

    } catch (\Throwable $e) {
        throw $this->wrapException($e);
    }
}
但是,将这4行代码添加到每个公共方法中,并将每个方法的主体缩进一级,只是为了获得更可读的堆栈跟踪,这违反了标准,而且非常难看


有更好的办法吗?一个通用的OOP设计模式或者一些PHP特有的技巧可以解决这个问题,比如神奇的方法名?

不是专门为实现您的愿望而设计的
try
/
catch
构造吗?看起来你只是想重新创造一个边缘稍微少一点的轮子。为什么不在抛出时将对象本身添加到异常中呢?我通常会为此创建一个自定义的异常类,包括
\uuu toString()
方法,以便于记录…@Nordenheim,因此您建议将这4行复制/粘贴到每个公共方法中,并将每个公共方法的主体缩进一级,以获得更易于理解的堆栈跟踪。我认为这违反了原则,而且非常难看。@arkascha适用于我自己创建和抛出的异常,但不适用于运行时(如NPE)或我的类使用的库抛出的异常。“DRY”非常值得怀疑。。。我更喜欢“显式而非隐式”,因为它更透明、更可读。