我有这样的代码
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 {}块,我可以在error_log中看到POST,GET和SERVER变量,但是使用try {} catch {}块,我只看到默认的PHP错误。
答案 0 :(得分:2)
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块以记录您的变量。
如果你只是想让你的例子工作,你只需抛出异常就可以在那个catch块中获得PHP:
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");
}
虽然这很愚蠢:))
答案 1 :(得分:1)
但像header
这样的默认PHP函数不会抛出异常。
如果您希望它们抛出异常,则需要将错误处理程序设置为使用ErrorException:
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");
答案 2 :(得分:0)
我认为你在这里有一些问题/问题。
首先,try / catch块用于异常。 catch {}代码仅在抛出指定类型的异常时执行。
其次,header()函数不会抛出异常。相反,它只是直接生成PHP错误。
第三,要记录所有错误的变量,请查看set_error_handler(),这也应该解决上面的第二个问题。
答案 3 :(得分:0)
try / catch仅在您使用实际抛出异常的对象时才有效。 header()不是一个对象,永远不会抛出异常。就像我在回答your previous version这个问题时所说的那样,你需要设置一个自定义错误处理程序。
答案 4 :(得分:0)
这就是try / catch应该如何工作:catch块在try块中抛出异常时执行(仅在这种情况下)。
如果已经发送了标题,header()函数可能会生成警告,但它永远不会抛出异常。
回答你的问题:
你的catch块很好但你需要的代码实际上可以抛出异常(通常是面向对象的代码,但不一定)。但是,如果使用set_error_handler()创建自定义错误处理程序并在其中使用throw
,则可以将PHP配置为将常规错误转换为异常。
答案 5 :(得分:0)
听起来你想在抛出错误时将一些额外的信息输出到你的日志中。您应该检查PHP中的自定义错误处理。您可以定义处理脚本中错误的特定方法,并添加默认情况下不存在的功能。PHP Set error handler