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

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

  •  
  •   selfcreditgiving · 2019-09-10 14:05:48 +08:00 · 1886 次点击
    这是一个创建于 1892 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我就是想封装一下 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
    Fishdrowned
        1
    Fishdrowned  
       2019-09-10 14:17:34 +08:00
    selfcreditgiving
        2
    selfcreditgiving  
    OP
       2019-09-10 14:27:20 +08:00
    @Fishdrowned 确实是可以,,, 实际代码是用 laravel 写的,这段是为了提问抽出来写的,奇怪,laravel 的代码捕捉不到,单独执行的代码就可以了。 我再看看
    ipwx
        3
    ipwx  
       2019-09-10 14:29:19 +08:00
    @selfcreditgiving 你调用的“mytry”是不是 Laravel 的 mytry,而它不立刻执行你给的函数的?
    lshero
        4
    lshero  
       2019-09-10 14:34:15 +08:00
    set_exception_handler 不好用嘛?
    你看一下异常是不是被 app/Exceptions/Handler.php 里面的方法接管了
    Fishdrowned
        5
    Fishdrowned  
       2019-09-10 17:44:20 +08:00
    @lshero exception handler 的优先级在 try/catch 之后,应该不是这个问题。

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

    也可能是有拼写错误,调用错方法了,拼写错误造成的离奇 bug 不少见。
    autoxbc
        6
    autoxbc  
       2019-09-10 22:34:18 +08:00 via iPhone
    感觉这里提闭包属于名词误用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4288 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 01:02 · PVG 09:02 · LAX 17:02 · JFK 20:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.