我有这样的代码
try {
header("Location: http://www.google.com'n-abc");
}
catch (Exception $e) {
error_log(print_r($_POST, true));
error_log(print_r($_GET, true));
error_log(print_r($_SERVER, true));
}
没有try {} catch{}块,我可以看到POST, GET和SERVER变量在我的error_log,但与try {} catch{}块,我只看到默认的PHP错误。
- 是否有一种方法来显示POST, GET,和服务器变量在一个try {} catch{}块?
- 是否有一种方法让PHP包括POST, GET和服务器变量的所有错误得到记录到文件,而不仅仅是在我添加error_log(print_r($_POST, true));....?
try/catch一般用于想要抛出异常以防止PHP致命错误终止页面或使调试更容易的情况。下面是使用try/catch的方法:
try {
if($a === true)
{
header("Location: http://www.google.com'n-abc");
}
else
{
throw new Exception('$a was not true');
}
}
catch (Exception $e) {
error_log(print_r($_POST, true));
error_log(print_r($_GET, true));
error_log(print_r($_SERVER, true));
echo $e->getMessage(); // $a was not true
}
你没有在catch块中看到错误日志的原因是因为你从来没有抛出异常,所以PHP永远不会在catch块中查看你的变量日志。
如果你只是想让你的例子工作,你只需抛出一个异常,让PHP在catch块:
try
{
throw new Exception('redirecting...');
}
catch (Exception $e)
{
error_log(print_r($_POST, true));
error_log(print_r($_GET, true));
error_log(print_r($_SERVER, true));
header("Location: http://www.google.com'n-abc");
}
这太愚蠢了:)
但是默认的PHP函数如header
不会抛出异常。
如果你想让它们抛出异常,你需要设置错误处理程序使用ErrorException:
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");
我想你这里有一些问题。
首先,try/catch块用于异常。catch{}代码只在抛出指定类型的Exception时执行。
第二,header()函数不会抛出异常。相反,它只是直接生成一个PHP错误。
第三,要记录所有错误的变量,请查看set_error_handler(),它也应该处理上述第二个问题。
try/catch仅在使用实际抛出异常的对象时才有效。header()不是一个对象,永远不会抛出异常。就像我在回答这个问题的上一个版本时所说的,您需要设置一个自定义错误处理程序。
这就是try/catch应该如何工作的:当在try块中抛出异常时(并且仅在这种情况下),catch块执行。
header()函数可能会生成警告如果头已经发送,但它永远不会抛出异常。
回答你的问题:
-
你的catch块很好,但你需要的代码实际上可以抛出异常(通常是面向对象的代码,但不一定)。然而,如果你使用set_error_handler()创建一个自定义错误处理程序,并在其中使用
throw
,你可以配置PHP将常规错误转换为异常。 -
同上:set_error_handler()和set_exception_handler()
听起来您希望在抛出错误时向日志输出一些额外的信息。您应该查看PHP中的自定义错误处理。您可以在脚本中定义特定的方法来处理错误,并添加默认情况下不存在的功能。