set_error_handler& set_exception_handler

时间:2011-01-15 17:27:42

标签: php codeigniter

我使用以下函数来设置错误控制:

set_error_handler
set_exception_handler

发生错误时,它会调用此函数捕获错误并将其存储到数据库,然后再将用户重定向到通用页面

function log_error($exception)
 {
  if(is_object($exception))
   log_action(ERROR, "Exception with message " . $exception->getMessage() . " thrown in " . $exception->getFile() . " on line " . $exception->getLine(), base_url() . $_SERVER["REQUEST_URI"]);
  else
   log_action(ERROR, "Unable to catch exception. print out: " . print_r($exception, true), base_url() . $_SERVER["REQUEST_URI"]);

  header("Location: " . base_url() . "public_error_notification");
 }

这通常有效,除了很多次而不是获取错误对象,我只是得到一个数字。我一直得到的两个数字是8和2.您可以看到我在错误日志中记录了这些数字。我的问题是,这些数字意味着什么?当我查找它时,它是有道理的,因为文件有错误代码,但我现在得到的错误与文件无关。我假设它们是错误代码,那么有什么办法可以获得可以返回的错误代码列表吗?

3 个答案:

答案 0 :(得分:2)

error_handler回调采用带有此签名的函数:

handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] )

第一个参数是错误编号,第二个参数是描述错误的字符串。

同时,exception_handler具有此签名的功能:

handler ( object $exception )

第一个也是唯一一个参数是一个包含抛出异常细节的对象。

您遇到的问题是异常和错误没有相同的回调签名。当你正确处理异常时,你正在使用不适当的回调来处理错误。

当您看到82这样的数字时,您会发现错误,当您看到异常对象时,您将捕获异常。

答案 1 :(得分:2)

似乎你对异常处理程序和错误处理程序使用相同的回调,它们不传递相同类型的参数。

看看set_error_handler doc,第一个参数是错误代码,第二个是错误字符串。没有传递对象

http://php.net/set_error_handler

对于错误代码,请检查:

http://php.net/manual/en/errorfunc.constants.php

答案 2 :(得分:1)

我只想补充一点,你得到的数字是引发的错误级别,在php中为它们定义了一些内容,例如E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE。