异常在 php 代码中不起作用


Exception not working in php code

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

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

这将输出Hello

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

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

但它什么也没打印。捕获不是应该打印错误吗?还是我做错了什么

您要查找的是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 脚本,则会在编译时出现语法错误。

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

register_shutdown_function( "MyShutDownHandler" );
function MyShutDownHandler() {
    //Do something here.
}

不,这是一个语法错误(或 PHP 术语中的解析错误)。代码永远不会首先执行,因此不会引发异常。

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

我想

在@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之间的代码。您可以有自己的异常(具有一些自定义功能,如果需要,可以记录它们),并且它们会自动通过调用堆栈传递,直到被捕获为止。