首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
宝塔
V2EX  ›  问与答

PHP 的 try catch 不能捕捉到 closure(闭包)里的异常嘛?

  •  
  •   selfcreditgiving · 69 天前 · 561 次点击
    这是一个创建于 69 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我就是想封装一下 try catch,不用每次都写一遍 catch 自定义异常 和 未知异常。
    但是下面的 getResult() 里的异常捕捉不到,是什么原因?
    不用 mytry, 直接用 try catch 包起来写就能捕捉到。

    
    class CusMsgException extends Exception
    {
        // 空的就可以,主要是要这个异常的名字
    }
    
    function mytry($fn)
    {
        try {
            $result = $fn();
            return $result;
        } catch (CusMsgException $e) {
            echo "自定异常: ".$e->getMessage().PHP_EOL;
        } catch (Exception $e) {
            echo "未知异常: ".$e->getMessage().PHP_EOL;
        }
    }
    
    function getResult()
    {
        throw new CusMsgException("ffff");
        return "数据";
    }
    
    
    mytry(function () {
        $result = getResult();
        echo $result;
    });
    
    
    6 回复  |  直到 2019-09-10 22:34:18 +08:00
        1
    Fishdrowned   69 天前
        2
    selfcreditgiving   69 天前
    @Fishdrowned 确实是可以,,, 实际代码是用 laravel 写的,这段是为了提问抽出来写的,奇怪,laravel 的代码捕捉不到,单独执行的代码就可以了。 我再看看
        3
    ipwx   69 天前
    @selfcreditgiving 你调用的“mytry”是不是 Laravel 的 mytry,而它不立刻执行你给的函数的?
        4
    lshero   69 天前
    set_exception_handler 不好用嘛?
    你看一下异常是不是被 app/Exceptions/Handler.php 里面的方法接管了
        5
    Fishdrowned   69 天前
    @lshero exception handler 的优先级在 try/catch 之后,应该不是这个问题。

    估计调用栈里面有更接近的 try/catch 拿走了。

    也可能是有拼写错误,调用错方法了,拼写错误造成的离奇 bug 不少见。
        6
    autoxbc   69 天前 via iPhone
    感觉这里提闭包属于名词误用
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1065 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 18:23 · PVG 02:23 · LAX 10:23 · JFK 13:23
    ♥ Do have faith in what you're doing.