异常不能在PHP代码中工作

时间:2013-01-28 13:52:41

标签: php exception try-catch

我是一个php新手,所以这可能听起来微不足道 这是我的PHP代码

<?php
try
{
    echo "Hello";
}
catch (Exception $e)
{
    echo $e;
}
?>

这会输出Hello

现在我修改了代码以获得异常

<?php
try
{
    ech "Hello";
}
catch (Exception $e)
{
    echo $e;
}
?>

但它什么都没打印。是不应该打印错误。或者我做错了什么

3 个答案:

答案 0 :(得分:3)

您要找的是ErrorException

您可以像这样注册错误处理程序:

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

并发现错误:

try
{
    echo $a; //Use of undefined variable
}
catch (ErrorException $e)
{
    echo $e->getMessage();
}

但是你无法在php和任何其他语言中处理语法错误作为异常。当PHP脚本实际运行时,你得到致命错误的原因是解释了php。如果您尝试使用任何php编译器编译PHP脚本,则在编译时会出现语法错误。

如果您想在发生致命错误时添加一些日志记录或类似内容,可以注册 shutdown 功能(使用register_shutdown_function):

register_shutdown_function( "MyShutDownHandler" );

function MyShutDownHandler() {
    //Do something here.
}

答案 1 :(得分:2)

不,这是语法错误(或PHP术语中的解析错误)。代码永远不会在第一时间执行,因此不会抛出任何异常。

还应该注意,PHP核心函数不会抛出异常,因为PHP 5引入了异常并且它们没有删除旧的错误系统。所以现在你必须同时处理错误(核心,旧扩展)和异常(新的OO扩展,用户态代码)。您可以使用ErrorException部分避免这种情况(请参阅链接手册页上的示例),但仍然很痛苦。

答案 2 :(得分:0)

我想在@PLB和@fab给出的好答案中再加一点。

要捕捉异常需要抛出(有道理不是吗?:P)。

我非常喜欢的一个例子是将分区处理为0。

function divide($x, $y) {
    if ($y == 0) {
        $up = new Exception('Cannot divide by 0');
        throw $up; // :)
    }
    return $x/$y;
}

try {
    divide(3, 0);
    // more code can be added here, but is skipped if Exception is thrown.
} catch(Exception $e) {
    echo $e->getMessage();
}

那么为什么这是函数中if语句的改进?

首先,您无需在throwcatch之间手动跳过代码。您可以拥有自己的异常(使用一些自定义功能,也可以根据需要记录它们),并且它们会自动通过调用堆栈直到它们被捕获为止。