异常捕获(exception)和断言(assertion)的使用场景:
异常捕获:内存不足,运行时异常,用户输入错误(JSON格式不正确),数据库连接错误,IO错误
断言:写该代码的人造成的错误,例如指针为空(assert(nullptr!=p);)
一般生产环境不使用assert,因为会造成崩溃。
而异常捕获可用于给用户反馈,例如在HTTP服务中,用户发送的消息格式不正确(JSON格式非法),数据库连接错误,
这时候catch捕获对应的exception,并发送HTTP响应消息给客户端,返回错误码。
异常捕获伪代码:
catch (odb::exception &e)
{
trans.rollback();
LogError << "odb exception: " << e.what();
res_msg["status"] = (int)ERR_DB_ACCESS;
res_msg["message"] = "数据库错误";
SendHttpResponse(context, res_msg);
return;
}
catch (cppcms::json::bad_value_cast &e)
{
LogError << "bad_value_cast exception: " << e.what();
res_msg["status"] = (int)ERR_MESSAGE_FIELD_INCORRECT;
res_msg["message"] = "需要的消息字段不存在或内容错误";
SendHttpResponse(context, res_msg);
}
catch (std::exception &e)
{
LogError << "exception: " << e.what();
res_msg["status"] = (int)ERR_SERVER_ERROR;
res_msg["message"] = "服务器错误";
SendHttpResponse(context, res_msg);
}
总结:
assert用于检查产品上线前错误以及修复代码,生产环境不使用。
异常捕获用于处理不可控制的错误,生产环境可使用。