PHP:防止嵌套的try-catch捕获特定错误

PHP:防止嵌套的try-catch捕获特定错误,php,try-catch,Php,Try Catch,我有一个PHP脚本,需要执行回调函数并捕获特定类型的错误 <?php class MyException extends Exception{} function doStuff(callable $callback){ try{ $callback(); } catch(MyException $e){ #Deal with it } } ?> 回调函数可以使用try-catch来防止异常冒泡。我如何允许

我有一个PHP脚本,需要执行回调函数并捕获特定类型的错误

<?php

class MyException extends Exception{}

function doStuff(callable $callback){

    try{
        $callback();
    }
    catch(MyException $e){
        #Deal with it
    }
}

?>


回调函数可以使用try-catch来防止异常冒泡。我如何允许回调函数实现try-catch块,但不允许它捕获MyException?

如果我读错了问题,请原谅-我想不出需要这样做的用例-但我认为类似的方法可以工作:

<?php

class MyException extends Exception {}

/*
 * This method is in the library. It's not in your control
 */
function doStuff(callable $callback) {
    try {
        $callback();
    } catch(Exception $e) {
        die($e->getMessage());
    }
}

/*
 * We want to do something, but not let any MyException pass through to doStuff()
 */
doStuff(function() {
    try {
        connect('mysql:dbname=IDoNotExist;host=127.0.0.1', 'batman', 'robin');
    } catch(MyException $e) {
        return; // Do nothing with MyException, continue as if it didn't happen
    } catch(Exception $e) {
        throw new Exception($e); // Not an instance of MyException ... let the library handle it
    }
});

/*
 * This is dummy code that will throw MyException if the username and password are incorrect
 */
function connect($dsn, $username, $password) {
    try {
        $dbh = new PDO($dsn, $username, $password);
    } catch(PDOException $e) {
        throw new MyException($e->getMessage());
    }
}

如果我把问题看错了,请原谅——我想不出一个需要这样做的用例——但我认为这样做会奏效:

<?php

class MyException extends Exception {}

/*
 * This method is in the library. It's not in your control
 */
function doStuff(callable $callback) {
    try {
        $callback();
    } catch(Exception $e) {
        die($e->getMessage());
    }
}

/*
 * We want to do something, but not let any MyException pass through to doStuff()
 */
doStuff(function() {
    try {
        connect('mysql:dbname=IDoNotExist;host=127.0.0.1', 'batman', 'robin');
    } catch(MyException $e) {
        return; // Do nothing with MyException, continue as if it didn't happen
    } catch(Exception $e) {
        throw new Exception($e); // Not an instance of MyException ... let the library handle it
    }
});

/*
 * This is dummy code that will throw MyException if the username and password are incorrect
 */
function connect($dsn, $username, $password) {
    try {
        $dbh = new PDO($dsn, $username, $password);
    } catch(PDOException $e) {
        throw new MyException($e->getMessage());
    }
}

我认为你做不到。用例?我看不出不允许回调处理自己的异常的原因,这个回调首先应该抛出异常。@Devon我怀疑用例是回调使用了他的库,库抛出异常。我唯一能想到的就是不要使它成为
Exception
的子类。然后,如果他的代码有
catch(异常$e)
,它将不会捕获它。@Barmar这是正确的。我希望回调不知道错误的含义。我只想回调停止并返回到库,这样它就可以处理这个问题。我认为你不能。用例?我看不出不允许回调处理自己的异常的原因,这个回调首先应该抛出异常。@Devon我怀疑用例是回调使用了他的库,库抛出异常。我唯一能想到的就是不要使它成为
Exception
的子类。然后,如果他的代码有
catch(异常$e)
,它将不会捕获它。@Barmar这是正确的。我希望回调不知道错误的含义。我只想回调以停止并返回到库,这样它就可以处理该问题。我确实希望doStuff()函数中的try catch能够提取MyException。我试图防止回调中的任何代码捕获该特定异常,以确保它总是冒泡。从本质上说,我不想让回调覆盖我的错误处理。从每个人的评论来看,我似乎需要重新思考整个工作方式。最好在回调中设置try-catch并返回true/false以显示回调是否成功。谢谢大家的帮助。我会再仔细考虑一下,希望能找到一个更合适的解决方案。我确实希望doStuff()函数中的try-catch能够发现我的异常。我试图防止回调中的任何代码捕获该特定异常,以确保它总是冒泡。从本质上说,我不想让回调覆盖我的错误处理。从每个人的评论来看,我似乎需要重新思考整个工作方式。最好在回调中设置try-catch并返回true/false以显示回调是否成功。谢谢大家的帮助。我会仔细考虑一下,希望能找到一个更合适的解决方案。