php 开发针对异常处理的一些困惑?

在使用业务处理PHP问题的时候, 肯定会考虑到程序之间交互(mysql, redis, memcached...)的返回值问题.
一般来说, 针对业务会考虑到如果数据库插入失败怎么办, redis 的命令执行失败怎么办,可能是网络超时, 或者服务器崩溃等原因导致, 但是这些情况发生时,我常常不知道程序这边要如何处理, 比如, 数据库插入失败, 那么pdo的inset方法是返回一个false还是程序直接报异常? phpredis 在操作redis的时候网络断开了, 是返回null还是程序异常?归根结底, 是对每个方法的返回值或者类库对各种可能不成功的原因的处理方式上不熟悉, 导致需要用极其繁琐的 if $return === 1 这样的严格判断来确定下一步程序走向, 导致代码很不整洁.
考虑过使用try 和 catch 来包裹整个数据库插入代码段, 但是又怕插入失败返回的仅是 $return=0,那就失去了意义.
请问各位大佬, 在处理这些与mysql和redis交互的逻辑时,是否有一个统一的记忆方法来判断命令执行是成功还是失败?还是说必须通过文档熟记每一个方法在执行时,对每一个错误(网络断开,要交互的服务器崩溃,被拒绝连接...)的返回值熟记于心才行?

阅读 3.1k
2 个回答

这就是错误机制的处理方法。

首先try ... catch..是必须要做的标准开发编程手段。其次在catch里面,通常要分清楚错误类型,数据库错误,网络错误,综合错误等等。然后根据不同的错误做处理。如果是与api做链接,那么通常要返回非200的response,然后api端要做请求或者推送没有成功的记录,为下一次推送做准备。如果是非api的程序,通常要保存请求的数据方便日后回复。关于保存请求数据的做法通常是走一个完全独立的数据库,避免因主机连接问题导致无法记录错误日志,可以是远程的(这个是比较推荐的,借用第三方处理log),可以是本地的。如果在网络不通的情况下,最原始的保存是在本地文件里面。如果是非常极端的情况,那就不是程序应该处理的范围了。

对于 MySQL,默认是静默模式(既不警告又不抛出异常)。

clipboard.png

但是我们可以通过手动设置来让 PDO 抛出异常

$pdo = new PDO(
            $config['dsn'], $config['username'], $config['password'],
            [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            ]
        );

对于 Redis,只要无法连接服务器就会抛出异常。

clipboard.png

所以还是有办法通过 try ... catch 来优雅处理这些问题的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题