pythontrycatch所有异常状态_在try/catch抛出异常时,如何处理代码逻辑执行不完整的问题?...

这两个是业务问题,与具体错误处理方法无关。

问题一:如果能用数据库事务最好(数据库的all or nothing了解下?)。如果用不了,你得从业务角度考虑,数据一部分更新了,一部分没有更新,怎么处理?一个比较简单的方法是,如果更新A成功了,更新B失败了,则回滚A。如果回滚A也失败了呢?一种方案是报警,人工介入;一种方案是起一个后台Repair服务,会持续扫描数据库,尝试修复不一致的数据;还有一种方案是,手动模拟事务,比如,执行任务前,先写一条oplog,表明我要开始做某件事了,然后更新数据A,再更新B,最后删除oplog,如果某中任何一步失败了,依赖一个后台线程,去查pending的oplog,从而去修复对应的数据。等等其他。

确认了策略后,用代码实现反而是次要的事情,与异常无关,与错误码也无关。

问题二:本质上和问题一类似,也是业务问题。一般我们的经验时,要执行ABCD操作时,将影响最严重的放在最后,作用commit点(可见点),这样,前面失败了,还能回滚。你所说的场景中,可以先保存到数据库中,再返回给用户。这样,保存操作失败,还可以尝试重试,或者给用户比较友好的提示。如果先返回了,再保存,事情就有些难处理了,只能给用户说失败了。

单就机制本身,"完全回退到之前的状态",你需要的实际上是rollback功能:

void update_data()

{

update_data_a();

scope_fail _(rollback_data_a);

update_data_b();

scope_fail __(rollback_data_b);

update_data_c();

}

scope_fail会在函数异常退出时执行特定代码。就需要注意的是,如果rollback也失败了呢?

"在exception解决掉以后继续执行逻辑",你需要的实际上是fallback功能:

void update_data()

{

try {

update_data_a();

} catch (const db_error& e) {

try_fix_error(e);

update_data_a();

}

scope_fail _(rollback_data_a);

try {

update_data_b();

} catch (const db_error& e) {

try_fix_error(e);

update_data_b();

}

scope_fail __(rollback_data_b);

try {

update_data_c();

} catch (const db_error& e) {

try_fix_error(e);

update_data_c();

}

}

不过可惜的是,大部分场景下,这个try_fix_error是无法实际的,比如,数据库挂了,你怎么在代码里面fix?如果try_fix_error也失败了呢?

特定的exception是可以处理的,比如,你尝试加载一个配置文件,如果发现文件不存在,就使用一个默认配置文件:

Conf load_conf(const std::string& path)

try {

auto file = jsonxxx::open_stream(path);

auto json = jsonxxx::parse_json(file);

return Conf(json);

} catch (jsonxxx::file_not_exist&) {

return DEFAULT_CONF;

}

更多内容请参考:吴乎:C++异常实战之十一 复杂场景(非fail-fast)下的异常处理​zhuanlan.zhihu.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值