0

我是 php 新手,所以这听起来很简单这是我的 php 代码

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

这输出Hello

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

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

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

4

3 回答 3

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 脚本,你会在编译时遇到语法错误。

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

register_shutdown_function( "MyShutDownHandler" );

function MyShutDownHandler() {
    //Do something here.
}
于 2013-01-28T13:58:56.557 回答
2

不,这是语法错误(或 PHP 术语中的解析错误)。代码从一开始就不会被执行,所以不会抛出异常。

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

于 2013-01-28T13:54:49.847 回答
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对函数中语句的改进呢?

一方面,您无需手动跳过 和 之间的throw代码catch。您可以拥有自己的异常(具有一些自定义功能,如果需要,可以记录它们),它们会自动通过调用堆栈传递,直到它们被捕获。

于 2013-01-28T14:16:27.807 回答