0

我的 PHP 应用程序中有几个地方,根据之前调用的函数,如果出现问题,我需要显示不同的错误消息。

例如,在下面的示例中,如果您直接在“文件”上调用 startEdit() 函数并且文件被锁定,它应该返回特定的错误消息。但是,如果 startEdit() 函数由于其父“文件夹”中的 startEdit() 函数而被调用,则它应该显示不同的错误消息(参见下面的示例):

<?php
    class folder{
        public $files = array();

        public function startEdit(){
            //when we start editing a folder, start editing all files within it
            foreach($this->files as $file){
                $file->startEdit();
            }
        }
    }

    class file{
        public $isLocked = true;

        public function startEdit(){
            try{
                //if the file is locked we need to throw an exception
                if($this->isLocked==1){

                    //loop through the stack trace to see if this was called from the folder class.
                    foreach(debug_backtrace() as $frame){
                        if($frame['class']=='folder'){
                            throw new Exception("Cannot edit this folder because one of the files within it are locked");
                        }
                    }

                    //if not called from the folder class then throw a different error
                    throw new Exception("This file is locked");
                }
            }catch(Exception $e){
                exit("Exception: ".$e->getMessage());
            }
        }
    }

    //create a new folder
    $folder = new folder();
    //put some files within it
    $file1 = new file();
    $file2 = new file();
    $folder->files = array($file1, $file2);

    //start editing the folder - should return the message 'Cannot edit this folder because one of the files within it are locked'
    $folder->startEdit();

    //try editing one of the files - should return the message 'This file is locked'
    $file1->startEdit();

?>

这是我正在尝试做的一个非常简化的版本 - 在我的应用程序中,错误消息可能取决于一个在 5 或 6 个堆栈帧之前调用的函数。

我的问题是 - 这是一种有效的做事方式吗?有没有更好的方法来实现这一点?

谢谢!

更新

为了清楚起见,我不想向用户显示实际的堆栈跟踪,我想使用堆栈跟踪为用户创建更多有用的消息。我猜另一种方法是将另一个参数传递给每个函数,告诉它从哪里调用它?

有没有其他人尝试过做类似的事情?对此的任何帮助将不胜感激!

4

2 回答 2

0

最后我决定不使用 debug_backtrace()。这是因为它返回的数组可能很大(取决于函数调用的数量),所以我认为它可能会影响性能。在上面的示例中,我将在“文件”对象上实现一个名为 canStartEdit() 的方法,并在“文件夹”对象中调用它——这样我就可以在文件夹对象中抛出异常而不必这样做在文件对象中,然后计算出之前的内容。

于 2013-05-22T09:56:01.317 回答
0

如文档中所述,有一个 $limit 选项

调试回溯

于 2017-01-20T14:15:26.753 回答