V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mokeyjay
V2EX  ›  PHP

PHP 中的自定义函数如何实现带 @时不抛出错误?

  •  
  •   mokeyjay · 2016-09-16 16:12:28 +08:00 · 2270 次点击
    这是一个创建于 2771 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在一些 PHP 内置函数(例如 mkdir )中,在前面添加 @可以屏蔽该函数抛出的错误

    那么自定义函数要如何实现这点呢?

    我试了下throw new Exceptiontrigger_error都无法被 @屏蔽

    11 条回复    2016-09-18 18:03:09 +08:00
    halfcoder
        1
    halfcoder  
       2016-09-16 17:19:23 +08:00
    我记得 @ 好像实际就是在函数调用调整错误级别吧
    cxbig
        2
    cxbig  
       2016-09-16 20:52:26 +08:00
    PHP 里 Exception 和其他的 Fatal error 这类不是一个概念。
    一个好的设计是善用 Exception 做异常处理,而不是简单的用 @掩盖。
    msxcms
        3
    msxcms  
       2016-09-16 21:00:32 +08:00
    不要这么处理错误
    lslqtz
        4
    lslqtz  
       2016-09-16 21:12:57 +08:00
    http://www.w3school.com.cn/php/php_exception.asp
    捕获异常,然后做处理。
    那玩意是只能屏蔽警告的吧。。
    lslqtz
        5
    lslqtz  
       2016-09-16 21:23:06 +08:00
    不过我试了下,@可以屏蔽的啊。。
    Fatal error: 1 in D:\*\1.php on line 2
    @trigger_error('1',E_USER_ERROR);
    加 @就不提示了。
    lslqtz
        6
    lslqtz  
       2016-09-16 21:26:53 +08:00
    <?php
    function asd() {
    trigger_error('1',E_USER_ERROR);
    }
    @asd();
    ?>
    C:\Users\lslqtz>php -f D:\***\1.php

    C:\Users\lslqtz>
    mokeyjay
        7
    mokeyjay  
    OP
       2016-09-17 21:08:43 +08:00
    @halfcoder 抱歉没听太懂,能详细说说吗?
    mokeyjay
        8
    mokeyjay  
    OP
       2016-09-17 21:12:51 +08:00
    @cxbig
    @msxcms
    是这样的,例如我想写一个 JsonFile::get()方法,当文件不存在时抛个错、路径非法时抛个错、解码失败时抛个错,并返回 false

    当用户在意错误信息时可以自行捕捉并处理;当不在意错误信息只希望得到文件内容或 false (失败)时,可以

    `@JsonFile::get()`

    这样调用

    主要也是为了方便嘛。请问如何实现这样的自定义方法(或函数)呢?

    或者说我这样的思路不太好?有没有既方便又合理的实现方法呢?
    AbrahamGreyson
        9
    AbrahamGreyson  
       2016-09-17 21:21:00 +08:00
    永远不要用 @
    halfcoder
        10
    halfcoder  
       2016-09-17 21:29:53 +08:00
    @mokeyjay 根据 PHP 官方文档, @ 符号作用于一个表达式上,用于抑制表达式计算过程中发生错误的消息显示,但是并不会阻止通过 set_error_handler() 设置的自定义错误处理函数的触发。其实际作用类似于在执行该表达式前先通过 error_reporting() 将错误报告级别设为 0 (关闭错误显示),执行完表达式后再恢复原有错误报告级别。

    参见: http://php.net/manual/en/language.operators.errorcontrol.php
    http://php.net/manual/en/language.operators.errorcontrol.php#85042
    cxbig
        11
    cxbig  
       2016-09-18 18:03:09 +08:00
    @mokeyjay 我没见过哪个企业会允许在项目代码里使用 @的。
    你提到的“文件存在”、“路径非法”和“ JSON 解码失败”都有具体的函数去检查。
    拿到结果后在 get 里 throw new Exception 或 return false 都是可以接受的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1257 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:00 · PVG 02:00 · LAX 11:00 · JFK 14:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.