PHP try-catch块没有按预期捕获问题

时间:2014-03-15 12:34:12

标签: php exception

我有以下代码可以使用(必须捕获异常),但事实并非如此。

<?php

class Entertainment {
}

class Clown extends Entertainment{
}

class Job {
}

function handleEntertainment(Entertainment $en, callable $callback = NULL){
    try{
        print("Handling " . get_class($en) . " is fun");
        if($callback !== NULL){
            $callback();
       }/*else {
            print("<br />" . "Function must be given!");
        }*/
    }catch(Exception $e){
        echo("Exception: " . $e->getMessage() . " Line: " . $e->getLine());
    }
}

$functionCallback = function(){
    print("<br />". " I am a function");
}

?>

这是测试文件

<?php
require_once("manyclasses.php");

try{
    handleEntertainment(new Clown());
    handleEntertainment(new Job());
}catch(Exception $e){
    echo("Exception: " . $e->getMessage() . " Line: " . $e->getLine());
}


?>

第二个调用handleEntertainment(new Job());应该抛出异常并且必须被捕获但是它不能正常工作。我得到的是

Catchable fatal error: Argument 1 passed to handleEntertainment() must be an instance of Entertainment, instance of Job given, called in ................

我试图在这里搜索答案,但我读到的帖子让我更加困惑。有些人说警告和错误不会被视为例外。

我的理解是警告和错误也是例外,try和catch块必须能够捕获它们。

为什么它不起作用,为什么警告和错误不是例外?

1 个答案:

答案 0 :(得分:0)

这是因为Catchable Fatal Error是导致引擎处于不稳定状态的错误,因此应该中止执行。
想一想:在“正常”异常之后,有时可以恢复程序执行流程,而在这种情况下最好中止执行。

但是,如果您需要,可以定义your own error handler并让执行继续