异常在 PHP 5.3 中的最佳实践 已翻译 100%

翼飞 投递于 2014/12/01 11:27 (共 15 段, 翻译完成于 12-22)
阅读 4285
收藏 71
PHP
0
加载中

每一个新的功能添加到PHP运行时会创建一个指数随机数,通过这样的方式开发者可以使用和甚至滥用这个新特性。然而,直到一些好的和坏的使用情况陆续出现开发者们才达成了共识。当这些新案例不断浮现,我们终于可以辨别出什么是最好或最坏的做法。

异常处理在PHP中的确无论如何都不算是一个新的特征。但在本文中,我们将讨论在PHP 5.3中基于异常处理的两个新的特点。第一个是嵌套异常第二是一套SPL(现在的PHP运行机制的一个核心扩展)的扩展的新的异常类型。这两个新特性,这本书里都能找到最佳实践值得各位去详细研究。

艾草glass
翻译于 2014/12/05 11:36
1

特别要注意:这些特性中的一些已经存在于低于5.3的PHP版本之中,或者至少能够在低于5.3的版本之中被实现.  而当本文提到 PHP 5.3, 并不是严责意义上的 PHP 运行时版本. 相反,它意味着代码库和项目是采用 PHP 5.3 作为最低版本的,但同时也是在新的发展阶段出现的所有最佳实践.  这个发展阶段所凸显的是特定的几个像Zend Framework, Symfony, Doctrine 以及 PEAR 这样的项目所进行的“2.0”尝试.

LeoXu
翻译于 2014/12/08 19:58
1

背景

PHP 5.2  只有一个异常类 Exception。按照 Zend Framework / PEAR 的开发标准, 这个类是你的库中所有异常类的基类。如果你创建一个名叫 MyCompany 的库,按 Zend Framework / PEAR 的标准, 库中所有的代码文件都会以 MyCompany_ 开头。要是你想给库创建自己的异常基类: MyCompany_Exception, 那就用该类继承 Exception,然后再由组件(component )继承和抛出该异常类。比如你有一个组件 MyCompany_Foo,你可以给它创建一个用在该组件内部的异常基类 MyCompany_Foo_Exception。这些异常能被捕捉 MyCompany_Foo_Exception,MyCompany_Exception 或 Exception 的代码捉到。 对于库中其他用到该组件的代码来说,这是个三层的异常(或更多,取决于 MyCompany_Foo_Exception 的子类有几层 ), 他们可以根据自己的需要处理这些异常。

BreakingBad
翻译于 2014/12/08 16:43
1

在php5中,基本异常类已经支持嵌套的特性了。什么是嵌套呢?嵌套是一种能力可以去捕获特殊异常,或者捕获参照原始异常而创建的一个新的异常对象。这将会允许caller属性在更公开的类型的开销库中出现的两种异常类上得到体现,当然也会在具有原始异常行为的异常类上体现。

为什么这些特性很有用?通常,通过使用其他代码来抛出自己的类型的异常是最有效的代码。这些代码可能是使用适配器模式封装的提供一些适应性更强强的函数的第三方代码库的代码,或利用一些PHP扩展来抛出异常的简单代码。

艾草glass
翻译于 2014/12/07 22:00
1

例如,在组件 Zend_Db 中, 它使用了适配器模式来封装特定的 PHP 扩展,来创建一个数据库抽象层.  在一个适配器中, Zend_Db 封装了 PDO, 而 PDO 会抛出它自己的异常 PDOException, Zend_Db 需要捕获这些特定于 PDO 的异常,并让它们以可预期且类型已知的 Zend_Db_Exception 重新被抛出. 这样就给了开发者保证, Zend_Db 将总是抛出 Zend_Db_Exception 类型的异常(因此可以被捕获), 而他们同时也可以在需要的时候访问到最开始被抛出的 PDOException.

下面的示例展示了一个虚构的数据库适配器可能如何去实现嵌入式的异常:

class MyCompany_Database
{
    /**
     * @var PDO object setup during construction
     */
    protected $_pdoResource = null;
    
    /**
     * @throws MyCompany_Database_Exception
     * @return int
     */
    public function executeQuery($sql)
    {
        try {
            $numRows = $this->_pdoResource->exec($sql);
        } catch (PDOException $e) {
            throw new MyCompany_Database_Exception('Query was unexecutable', null, $e);
        }
        return $numRows;
    }

}

为了使用嵌入式的异常,你就得调用被捕获异常的getPrevious()方法:

// $sql and $connectionParameters assumed
try {
    $db = new MyCompany_Database('PDO', $connectionParams);
    $db->executeQuery($sql);
} catch (MyCompany_Database_Exception $e) {
    echo 'General Error: ' . $e->getMessage() . "\n";
    $pdoException = $e->getPrevious();
    echo 'PDO Specific error: ' . $pdoException->getMessage() . "\n";
}

大多数最近被实现的PHP扩展都拥有OO(面向对象)接口.  因此,这些API倾向于抛出异常,而不是发生错误终止。PHP中能够抛出异常的扩展,稍微列举出几个就包括有PDO, DOM, Mysqli, Phar, Soap 以及 SQLite.

LeoXu
翻译于 2014/12/08 20:09
1

新特性:新核心异常类型

在PHP 5.3开发中,我们展示了一些有趣的新异常类型。这些异常在PHP 5.2.x中已经存在,但最近还没到“重新评估”异常的最佳实践,现在他们会显得更加引人注目。他们在SPL扩展中得以应用,并在手册中列出(这里)由于这些新的异常类型是PHP核心的一部分,也是SPL的一部分,它们可以被任何用PHP 5.3(及以上)运行代码的人使用。虽然在编写应用程序层的代码时,看起来不那么重要,但在我们写或者使用代码库时,使用这些新异常类型变得更加重要

泷涯SY
翻译于 2014/12/22 17:41
1

那么为什么新异常是普通类型?以前,开发者试图通过在异常消息提醒中放入更多的内容来赋予异常更多的含义。虽然这样做是可行的,但是它有几个缺点。一是你无法捕获基于消息的异常。这可是一个问题,如果你知道一组代码是同样的异常类型与不同的提示消息对应不同异常情况下,处理起来的难度将相当的大。例如,一个认证类,在对$auth->authenticate();;它抛出异常的相同类型的(假设是异常),但不同的消息对应两个具体的故障:产生故障原因是认证服务器不能达到但是相同的异常类型却提示失败的验证消息不同。在这种情况下(注意,使用异常可能不是处理认证响应最好的方式),这将需要用字符串来解析消息从而处理这两种不同的情况。

艾草glass
翻译于 2014/12/07 22:03
1

这个问题的解决办法显然是通过某种方式对异常进行编码,这样就可以在需要辨别如何对这种异常环境做出反应的时候能够更加容易的查询到。第一个反应库是使用异常基类的$code属性。另一个是通过创建可以被抛出且能描述自身行为的子类或者新的异常类。这两种方法具有相同的明显的缺点。两者都没有呈现出想这样的最好的例子。两者都不被认为是一个标准,因此每个试图复制这两种解决方案的项目都会有小的变化,这就迫使使用这需要回到文档以了解所创建的库中已经有的具体解决方案。现在通过使用SPL的新的类型方法,也称作php标准库;开发者就可以以同样的方式在他们的项目中,并且复用这些项目的新的最佳的方法已经出现。

艾草glass
翻译于 2014/12/07 22:04
1

第二个缺点是使用详细信息的做法使得理解这些异常情况对那些非英语或英语能力有限的开发者来说十分困难。这可能会使的开发者在试图理解异常信息的含义的过程十分的缓慢。许多开发者也会写关于异常的文章,因为还未出现一个统一的整合过的标准所要有同这些开发者数量相同的不同的版本来描述异常消息所描述的情况。

所以我如何去使用它们,就用这些让人无语的密密麻麻的细节描述?

现在在SPL中有总共13个新的异常类型。其中两个可被视为基类:逻辑异常和运行时异常;两种都继承php异常类。其余的方法在逻辑上可以被拆分为3组:动态调用组,逻辑组和运行时组。

艾草glass
翻译于 2014/12/07 22:04
1

动态调用组包含异常 BadFunctionCallException和BadMethodCallException,BadMethodCallException是BadFunctionCallException(LogicException的子类)的子类,这意味着这些异常可以被其直接类型(译者注:就是异常自身的类型,大家都知道异常有很多种)、LogicException,或者Exception抓到(译者注:就是catch)你应该在什么时候使用这些?通常,你应该在由一个无法处理的__call()方法产生的情况,或者回调无法不是一个有效的函数(简单说,当某些东西并非is_callable())时使用。

例如:

// OO variant
class Foo
{
    public function __call($method, $args)
    {
        switch ($method) {
            case 'doBar': /* ... */ break;
            default:
                throw new BadMethodCallException('Method ' . $method . ' is not callable by this object');
        }
    }

}

// procedural variant
function foo($bar, $baz) {
    $func = 'do' . $baz;
    if (!is_callable($func)) {
        throw new BadFunctionCallException('Function ' . $func . ' is not callable');
    }
}

一个直接的例子,在__call时call_user_func()。这组异常在开发各种API动态方法的调用、函数调用时非常有用,例如这是一个可以被SOAP和XML-RPC客户端/服务端能够发送和解释的请求。

泷涯SY
翻译于 2014/12/21 12:02
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(51)

甘薯
甘薯

引用来自“JM_Joy”的评论

try catch 让我的代码很不优雅

引用来自“eechen”的评论

某些人就是认为用try/catch处理程序逻辑错误才优雅,用if/else就是丑陋土鳖,说白了,就是Java优越感作祟. 个人觉得PHP自带的错误处理机制就很好,既可以自动或手动记录到日志(error_log配置和error_log函数), 也可以用set_error_handler设置一个用户定义的函数,用来处理错误,比如把错误转成异常抛出ErrorException,抬升下逼格. 还可以用set_exception_handler设置一个用户定义的函数,用来处理所有未捕获的异常. 总结:Java就是复杂就是烦,PHP就是简单就是快.

引用来自“ZeroOne”的评论

说得貌似挺有理,不过你好像没区分开php处理逻辑异常和系统错误, 处理所有未捕获的异常, 那得有多少个ifelse判断啊,还是注册全局函数,万一有其他的模块也注册了导致互相影响吗, OMG...

引用来自“李九仙”的评论

还ifelse,类有类型的~~小学生同学
别2B了, PHP一开始就有类? 现在为啥拼命向OOP靠拢?你就说你设置出错处理函数是否是全局的?在出错处理函数里堆栈都破坏了, 你如果不用常量定义或者全局变量传递如何拿到除了出错文件行数什么的之外的出错变量?要么你一步一个坑到处设置error handle?真是傻的要死, 你这种水平低下的phper在phper里面都算是最弱智的.还好意思说类, PHP的弱类型不严谨乱入的脚本特性对类根本就不可能是特别友好的, P都不懂还上来指责别人... 恶心.
李九仙

引用来自“JM_Joy”的评论

try catch 让我的代码很不优雅

引用来自“eechen”的评论

某些人就是认为用try/catch处理程序逻辑错误才优雅,用if/else就是丑陋土鳖,说白了,就是Java优越感作祟. 个人觉得PHP自带的错误处理机制就很好,既可以自动或手动记录到日志(error_log配置和error_log函数), 也可以用set_error_handler设置一个用户定义的函数,用来处理错误,比如把错误转成异常抛出ErrorException,抬升下逼格. 还可以用set_exception_handler设置一个用户定义的函数,用来处理所有未捕获的异常. 总结:Java就是复杂就是烦,PHP就是简单就是快.

引用来自“ZeroOne”的评论

说得貌似挺有理,不过你好像没区分开php处理逻辑异常和系统错误, 处理所有未捕获的异常, 那得有多少个ifelse判断啊,还是注册全局函数,万一有其他的模块也注册了导致互相影响吗, OMG...
还ifelse,类有类型的~~小学生同学
李九仙

引用来自“ZeroOne”的评论

PHP的异常没什么意义,
因为它不能捕获runtime exception.也就是外部调用产生的异常.
只能捕获自己定义的异常,这点很恶心, 因为如果捕获到了自己定义的异常就已经知道发生了什么,
根本不需要用异常来改变程序的流程.

引用来自“李九仙”的评论

又见逗B。。。。菜鸟就不用来评论了。。php的系统异常处理函数和错误处理函数,是吃干饭的啊。。。

引用来自“ZeroOne”的评论

楼上才是逗比! 你有种把那些@取消错误显示的东西都去掉, 我看你的程序会怎么样! 现代编程语言还有那种不能通过try catch捕获系统错误而是靠注册一个影响全局行为的函数? 连javascript都能try catch. 你这种水平我看吃干饭都没什么希望了.

引用来自“李九仙”的评论

来,教教你怎么用~php!可以配置error_log输出错误报告到文件,也可以配置display_errors在页面显示错误,还可以用ErrorException类把错误转为异常,然后用set_error_handler()函数将错误信息托管给ErrorException: http://php.net/ErrorException 注:PHP内部函数主要使用错误报告,只有现代面向对象的扩展才使用异常. set_exception_handler()函数则可以设置一个用户定义的函数,用来处理所有未捕获的异常: http://php.net/set_exception_handler try/catch 捕获 PDOException: http://php.net/manual/zh/pdo.connections.php query('SELECT * from FOO') as $row) { print_r($row); } $dbh = null; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . ""; die(); } ?> 不过不管脚本发生错误还是异常,都不会导致PHP-FPM和Apache崩溃退出.

引用来自“ZeroOne”的评论

就是你在这种没有见识无知的蠢货才拉低了phper整体的水平, 都告诉你了php不得不区分开逻辑异常和系统错误, 你这个傻逼故意装看不懂?java可以整体捕获然后按照捕获的任何错误进行处理, php还不得不区别对待,分别捕获系统错误然后一大堆的ifelse判断发生了什么事, 还有捕获可笑的逻辑错误. 逻辑错误在很多时候根本就用不着捕获的, 因为那根本就不是错误.这么说你这个低素质低水平的phper也不会明白的.滚远点吧, 蠢货.
好了,你让我看到你的智商了!谢谢!逗比孩子!小学生放假了~
李九仙

引用来自“ZeroOne”的评论

PHP的异常没什么意义,
因为它不能捕获runtime exception.也就是外部调用产生的异常.
只能捕获自己定义的异常,这点很恶心, 因为如果捕获到了自己定义的异常就已经知道发生了什么,
根本不需要用异常来改变程序的流程.

引用来自“李九仙”的评论

又见逗B。。。。菜鸟就不用来评论了。。php的系统异常处理函数和错误处理函数,是吃干饭的啊。。。

引用来自“ZeroOne”的评论

楼上才是逗比! 你有种把那些@取消错误显示的东西都去掉, 我看你的程序会怎么样! 现代编程语言还有那种不能通过try catch捕获系统错误而是靠注册一个影响全局行为的函数? 连javascript都能try catch. 你这种水平我看吃干饭都没什么希望了.

引用来自“李九仙”的评论

来,教教你怎么用~php!可以配置error_log输出错误报告到文件,也可以配置display_errors在页面显示错误,还可以用ErrorException类把错误转为异常,然后用set_error_handler()函数将错误信息托管给ErrorException: http://php.net/ErrorException 注:PHP内部函数主要使用错误报告,只有现代面向对象的扩展才使用异常. set_exception_handler()函数则可以设置一个用户定义的函数,用来处理所有未捕获的异常: http://php.net/set_exception_handler try/catch 捕获 PDOException: http://php.net/manual/zh/pdo.connections.php query('SELECT * from FOO') as $row) { print_r($row); } $dbh = null; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . ""; die(); } ?> 不过不管脚本发生错误还是异常,都不会导致PHP-FPM和Apache崩溃退出.

引用来自“ZeroOne”的评论

你这个都比根本就不知道异常和错误的区别和联系, 这种垃圾水平还是别干程序员了, 给这个行业整体丢脸.多看看java对异常和错误的处理, 那才叫完善, php这种脱胎于C语言设计理念的东西漏洞百出一点都不奇怪. 不然现在为啥拼命要向OOP靠拢?无知和素质差不是你的错,出来秀下限就不对了!
好了,你让我看到你的智商了!谢谢!逗比孩子!小学生放假了~
李九仙

引用来自“ZeroOne”的评论

PHP的异常没什么意义,
因为它不能捕获runtime exception.也就是外部调用产生的异常.
只能捕获自己定义的异常,这点很恶心, 因为如果捕获到了自己定义的异常就已经知道发生了什么,
根本不需要用异常来改变程序的流程.

引用来自“李九仙”的评论

又见逗B。。。。菜鸟就不用来评论了。。php的系统异常处理函数和错误处理函数,是吃干饭的啊。。。

引用来自“ZeroOne”的评论

楼上才是逗比! 你有种把那些@取消错误显示的东西都去掉, 我看你的程序会怎么样! 现代编程语言还有那种不能通过try catch捕获系统错误而是靠注册一个影响全局行为的函数? 连javascript都能try catch. 你这种水平我看吃干饭都没什么希望了.

引用来自“李九仙”的评论

来,教教你怎么用~php!可以配置error_log输出错误报告到文件,也可以配置display_errors在页面显示错误,还可以用ErrorException类把错误转为异常,然后用set_error_handler()函数将错误信息托管给ErrorException: http://php.net/ErrorException 注:PHP内部函数主要使用错误报告,只有现代面向对象的扩展才使用异常. set_exception_handler()函数则可以设置一个用户定义的函数,用来处理所有未捕获的异常: http://php.net/set_exception_handler try/catch 捕获 PDOException: http://php.net/manual/zh/pdo.connections.php query('SELECT * from FOO') as $row) { print_r($row); } $dbh = null; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . ""; die(); } ?> 不过不管脚本发生错误还是异常,都不会导致PHP-FPM和Apache崩溃退出.

引用来自“ZeroOne”的评论

你这个都比根本就不知道异常和错误的区别和联系, 这种垃圾水平还是别干程序员了, 给这个行业整体丢脸.多看看java对异常和错误的处理, 那才叫完善, php这种脱胎于C语言设计理念的东西漏洞百出一点都不奇怪. 不然现在为啥拼命要向OOP靠拢?无知和素质差不是你的错,出来秀下限就不对了!
好了,你让我看到你的智商了!谢谢!逗比孩子!小学生放假了~
甘薯
甘薯

引用来自“ZeroOne”的评论

PHP的异常没什么意义,
因为它不能捕获runtime exception.也就是外部调用产生的异常.
只能捕获自己定义的异常,这点很恶心, 因为如果捕获到了自己定义的异常就已经知道发生了什么,
根本不需要用异常来改变程序的流程.

引用来自“李九仙”的评论

又见逗B。。。。菜鸟就不用来评论了。。php的系统异常处理函数和错误处理函数,是吃干饭的啊。。。

引用来自“ZeroOne”的评论

楼上才是逗比! 你有种把那些@取消错误显示的东西都去掉, 我看你的程序会怎么样! 现代编程语言还有那种不能通过try catch捕获系统错误而是靠注册一个影响全局行为的函数? 连javascript都能try catch. 你这种水平我看吃干饭都没什么希望了.

引用来自“李九仙”的评论

来,教教你怎么用~php!可以配置error_log输出错误报告到文件,也可以配置display_errors在页面显示错误,还可以用ErrorException类把错误转为异常,然后用set_error_handler()函数将错误信息托管给ErrorException: http://php.net/ErrorException 注:PHP内部函数主要使用错误报告,只有现代面向对象的扩展才使用异常. set_exception_handler()函数则可以设置一个用户定义的函数,用来处理所有未捕获的异常: http://php.net/set_exception_handler try/catch 捕获 PDOException: http://php.net/manual/zh/pdo.connections.php query('SELECT * from FOO') as $row) { print_r($row); } $dbh = null; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . ""; die(); } ?> 不过不管脚本发生错误还是异常,都不会导致PHP-FPM和Apache崩溃退出.
你这个都比根本就不知道异常和错误的区别和联系, 这种垃圾水平还是别干程序员了, 给这个行业整体丢脸.多看看java对异常和错误的处理, 那才叫完善, php这种脱胎于C语言设计理念的东西漏洞百出一点都不奇怪. 不然现在为啥拼命要向OOP靠拢?无知和素质差不是你的错,出来秀下限就不对了!
甘薯
甘薯

引用来自“ZeroOne”的评论

PHP的异常没什么意义,
因为它不能捕获runtime exception.也就是外部调用产生的异常.
只能捕获自己定义的异常,这点很恶心, 因为如果捕获到了自己定义的异常就已经知道发生了什么,
根本不需要用异常来改变程序的流程.

引用来自“李九仙”的评论

又见逗B。。。。菜鸟就不用来评论了。。php的系统异常处理函数和错误处理函数,是吃干饭的啊。。。

引用来自“ZeroOne”的评论

楼上才是逗比! 你有种把那些@取消错误显示的东西都去掉, 我看你的程序会怎么样! 现代编程语言还有那种不能通过try catch捕获系统错误而是靠注册一个影响全局行为的函数? 连javascript都能try catch. 你这种水平我看吃干饭都没什么希望了.

引用来自“李九仙”的评论

来,教教你怎么用~php!可以配置error_log输出错误报告到文件,也可以配置display_errors在页面显示错误,还可以用ErrorException类把错误转为异常,然后用set_error_handler()函数将错误信息托管给ErrorException: http://php.net/ErrorException 注:PHP内部函数主要使用错误报告,只有现代面向对象的扩展才使用异常. set_exception_handler()函数则可以设置一个用户定义的函数,用来处理所有未捕获的异常: http://php.net/set_exception_handler try/catch 捕获 PDOException: http://php.net/manual/zh/pdo.connections.php query('SELECT * from FOO') as $row) { print_r($row); } $dbh = null; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . ""; die(); } ?> 不过不管脚本发生错误还是异常,都不会导致PHP-FPM和Apache崩溃退出.
就是你在这种没有见识无知的蠢货才拉低了phper整体的水平, 都告诉你了php不得不区分开逻辑异常和系统错误, 你这个傻逼故意装看不懂?java可以整体捕获然后按照捕获的任何错误进行处理, php还不得不区别对待,分别捕获系统错误然后一大堆的ifelse判断发生了什么事, 还有捕获可笑的逻辑错误. 逻辑错误在很多时候根本就用不着捕获的, 因为那根本就不是错误.这么说你这个低素质低水平的phper也不会明白的.滚远点吧, 蠢货.
甘薯
甘薯

引用来自“ZeroOne”的评论

PHP的异常没什么意义,
因为它不能捕获runtime exception.也就是外部调用产生的异常.
只能捕获自己定义的异常,这点很恶心, 因为如果捕获到了自己定义的异常就已经知道发生了什么,
根本不需要用异常来改变程序的流程.

引用来自“李九仙”的评论

又见逗B。。。。菜鸟就不用来评论了。。php的系统异常处理函数和错误处理函数,是吃干饭的啊。。。

引用来自“ZeroOne”的评论

楼上才是逗比! 你有种把那些@取消错误显示的东西都去掉, 我看你的程序会怎么样! 现代编程语言还有那种不能通过try catch捕获系统错误而是靠注册一个影响全局行为的函数? 连javascript都能try catch. 你这种水平我看吃干饭都没什么希望了.

引用来自“李九仙”的评论

逗比就别解释了,从不用@错误级别全开,写php!是新手小白就该低调点
低素质的傻逼,张口就喷粪?你给老子滚远点. 满嘴喷粪的phper, 老子用php写东西是为了框架快捷而不是为了研究php不怎么样的异常支持.你这个傻逼不用@不代表你看不到的底层不用. 你这个傻逼怎么表现的比php的发明者还牛逼?如果@根本用不到php的发明者吃多了非要发明这个东西?
李九仙

引用来自“ZeroOne”的评论

PHP的异常没什么意义,
因为它不能捕获runtime exception.也就是外部调用产生的异常.
只能捕获自己定义的异常,这点很恶心, 因为如果捕获到了自己定义的异常就已经知道发生了什么,
根本不需要用异常来改变程序的流程.

引用来自“李九仙”的评论

又见逗B。。。。菜鸟就不用来评论了。。php的系统异常处理函数和错误处理函数,是吃干饭的啊。。。

引用来自“ZeroOne”的评论

楼上才是逗比! 你有种把那些@取消错误显示的东西都去掉, 我看你的程序会怎么样! 现代编程语言还有那种不能通过try catch捕获系统错误而是靠注册一个影响全局行为的函数? 连javascript都能try catch. 你这种水平我看吃干饭都没什么希望了.
来,教教你怎么用~php!可以配置error_log输出错误报告到文件,也可以配置display_errors在页面显示错误,还可以用ErrorException类把错误转为异常,然后用set_error_handler()函数将错误信息托管给ErrorException: http://php.net/ErrorException 注:PHP内部函数主要使用错误报告,只有现代面向对象的扩展才使用异常. set_exception_handler()函数则可以设置一个用户定义的函数,用来处理所有未捕获的异常: http://php.net/set_exception_handler try/catch 捕获 PDOException: http://php.net/manual/zh/pdo.connections.php query('SELECT * from FOO') as $row) { print_r($row); } $dbh = null; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . ""; die(); } ?> 不过不管脚本发生错误还是异常,都不会导致PHP-FPM和Apache崩溃退出.
李九仙

引用来自“ZeroOne”的评论

PHP的异常没什么意义,
因为它不能捕获runtime exception.也就是外部调用产生的异常.
只能捕获自己定义的异常,这点很恶心, 因为如果捕获到了自己定义的异常就已经知道发生了什么,
根本不需要用异常来改变程序的流程.

引用来自“李九仙”的评论

又见逗B。。。。菜鸟就不用来评论了。。php的系统异常处理函数和错误处理函数,是吃干饭的啊。。。

引用来自“ZeroOne”的评论

楼上才是逗比! 你有种把那些@取消错误显示的东西都去掉, 我看你的程序会怎么样! 现代编程语言还有那种不能通过try catch捕获系统错误而是靠注册一个影响全局行为的函数? 连javascript都能try catch. 你这种水平我看吃干饭都没什么希望了.
逗比就别解释了,从不用@错误级别全开,写php!是新手小白就该低调点
返回顶部
顶部