为什么php 框架的数据库操作类,在插入和更新失败的时候为什么不能直接抛出系统异常?????而要自己再进行判断返回结果?

php 是通过fpm来处理请求,一个fpm进程处理一条请求,在数据库增删改查执行遇到错误时,就说明这条请求失败了,为什么框架在处理DB类的时候不能直接抛出异常,这样在一个事务中执行多个增改查就无须判断每条语句的执行结果了。

举个例子

class A {
    public function testA(){
        try {
            DB::beginTransaction();
            $res = GoodsModel::on()->where('id', $id)->update();
            if ($res) { // 如果update失败了 就直接停了,走catch语句不是更好
                $retCode = OrderModel::on()->insert();
                if (!$retCode) {
                     throw new Exception("处理失败");
                }
            }
            DB::commit();     
        } catch (Exception $ex) {
            DB::rollback();
            throw $ex;
         }
    }
}

如果用异常方式,这样不是更好????还请大佬作出解答!

class A {
    public function testA(){
        try {
            DB::beginTransaction();
            GoodsModel::on()->where('id', $id)->update();
            OrderModel::on()->insert();
            DB::commit();     
        } catch (Exception $ex) {
            DB::rollback();
            throw $ex;
         }
    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 12
panda-sir

$res 为隐士的false的时候不代表数据库语句执行失败了 只是代表受影响行数为0
比如 有一条user表数据ID为42 namejack

update user set name = 'jack' where id = 42

受影响行数是0 但这并不代表数据库语句执行失败了

3年前 评论
airy 3年前
WangYuanDa (楼主) 3年前
忆往昔弹指间 3年前
panda-sir

$res 为隐士的false的时候不代表数据库语句执行失败了 只是代表受影响行数为0
比如 有一条user表数据ID为42 namejack

update user set name = 'jack' where id = 42

受影响行数是0 但这并不代表数据库语句执行失败了

3年前 评论
airy 3年前
WangYuanDa (楼主) 3年前
忆往昔弹指间 3年前

执行失败本来就会抛出异常吧?

3年前 评论
WangYuanDa (楼主) 3年前
WangYuanDa (楼主) 3年前

例如你需要update一个订单的状态为发货状态,但是update语句返回了影响行数为0,这时候就说明有异常情况出现了吧。

3年前 评论

执行失败 意味着 在此行代码中断 抛出异常 代码从上到下执行完毕的 怎么可以定义人家为异常 或者说失败 你所谓的异常只是自己的业务逻辑而已

3年前 评论
WangYuanDa (楼主) 3年前
PhoenixIcy (作者) 3年前
WangYuanDa (楼主) 3年前
PhoenixIcy (作者) 3年前
WangYuanDa (楼主) 3年前

正常来说项目里面插入失败,是不会直接让代码直接抛异常的。是记录日志多一点

3年前 评论
WangYuanDa (楼主) 3年前
一念沧海一念桑田 (作者) 3年前

你想说的是saveOrFail?

3年前 评论
WangYuanDa (楼主) 3年前
JKair (作者) 3年前

你用的不是laravel框架吧,我用laravel向来都是从来不判断返回值,失败会自动抛出异常,就像你举得这个例子,我项目里基本都差不多是这个样子

try {
            DB::beginTransaction();
            GoodsModel::on()->where('id', $id)->update();
            OrderModel::on()->insert();
            DB::commit();     
        } catch (Exception $ex) {
            DB::rollback();
            throw $ex;
         }

其他的框架像老的TP,或者自己封装覆盖了一层 try catch 返回false一类的,这是个人习惯问题。

3年前 评论
Adachi (作者) 3年前
sodasix 3年前
Adachi (作者) 3年前

不是所有 SQL 执行后,都会有返回值, 所以这逻辑只要 SQL 能成功执行, 就代表是成功的,但是, SQL 语句执行成功但是影响函数为0, 这算异常吗, 大部分业务都不算异常吧, 所以小众的需求就自己写下逻辑判断咯.

3年前 评论

建议换成: 数据库事务
file

   DB::transaction(function (){
            $id = 1;
            $res = GoodsModel::on()->where('id', $id)->update() && 
                OrderModel::on()->insert();
           // 因为是&& 第一条执行成功  才会执行第二条 
           // 两条成功为true  
            if(! $res)
                throw new \Exception();
   });
3年前 评论

我以为只有我一个人会这样想 :joy:

3年前 评论

大可不必,Laravel 的 DB::transaction 不香吗?有错误就是直接抛异常,自动回滚。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!