我有一个带有show()方法的自定义异常类,它以一种漂亮的方式显示异常
在一些致命错误中,我将例外保留为未被捕获,因此程序存在于中间,但我希望这些例外与show方法一起显示。
可以这样做吗?
class MyException extends Exception
{
public $e;
public function _contruct($message, $code = 0)
{
parent::_construct($message, $code);
}
public function show()
{
if(!defined('DEBUG')) define('DEBUG', FALSE);
p("Error: " . $this->getMessage());
if(DEBUG)
{
p('Stack trace');
p($this->getFile() . ' (' . $this->getLine() . ')');
pre(get_dump($this->getTraceAsString()));
}
}
}
解决方案
class MyException extends Exception
{
public $e;
public function _contruct($message, $code = 0)
{
parent::_construct($message, $code);
}
public function show()
{
MyException::realShow($this);
}
static function realShow($e)
{
if(!defined('DEBUG')) define('DEBUG', FALSE);
p("Error: " . $e->getMessage());
if(DEBUG)
{
p('Stack trace');
p($e->getFile() . ' (' . $e->getLine() . ')');
pre(get_dump($e->getTraceAsString()));
}
}
}
如果有人有更好的方法,我就是全部的目光。
答案 0 :(得分:1)
当然,您可以使用set_exception_handler
函数设置未捕获的异常处理函数:
function exception_handler($ex) {
//$ex will be the thrown Exception object
}
set_exception_handler('exception_handler');
来自文档:
如果未在try / catch块中捕获异常,则设置默认异常处理程序。调用exception_handler后执行将停止
此外,您不需要覆盖构造函数,如果未覆盖父类的构造函数,它将自动调用。
答案 1 :(得分:-1)
您不应该在PHP中使用异常系统。
如文件中所述:
PHP异常系统甚至在抛出它们之前就会导致每个对象产生一定的开销。这需要细致的内存处理,仅建议用于系统关键异常(由您或用户无法控制)。对于更常见的事情,最好在自定义非异常对象上使用trigger_error。