错误处理

This commit is contained in:
2026-08-16 17:53:46 +08:00
parent 00a3c54820
commit 8612b5ff86
47 changed files with 744 additions and 544 deletions
+73 -70
View File
@@ -644,15 +644,7 @@ std::string Gallery_Protocol::case_json_from_controls(
result["type"] = manual_refresh ? "refresh_state" : "case_state";
result["case"] = case_contract(case_id);
result["frame_mode"] = frame_mode_contract(frame_mode);
try {
result["controls"] = Json::parse(controls_json.begin(), controls_json.end());
} catch (const std::exception&) {
result["controls"] = {
{"resources", Json::array()},
{"observers", Json::array()},
{"render_plan", Json::object()}
};
}
result["controls"] = Json::parse(controls_json.begin(), controls_json.end());
result["actions"] = {
{"descriptor", adminive::to_descriptor_json<Json, gallery_detail::Action_Model>()},
{"view", adminive::to_view_json<Json, gallery_detail::Action_Model>(
@@ -662,11 +654,7 @@ std::string Gallery_Protocol::case_json_from_controls(
for (const auto& action : gallery_detail::registered_actions(case_id, frame_mode))
result["actions"]["data"].push_back(
adminive::to_frontend_json<Json>(action));
try {
result["telemetry"] = Json::parse(telemetry_json.begin(), telemetry_json.end());
} catch (const std::exception&) {
result["telemetry"] = Json::object();
}
result["telemetry"] = Json::parse(telemetry_json.begin(), telemetry_json.end());
if (!notice.empty())
result["notice"] = notice;
return result.dump();
@@ -690,77 +678,92 @@ std::string Gallery_Protocol::observer_json(std::string_view case_id,
result["type"] = "observer_state";
result["case_id"] = case_id;
result["frame_mode"] = frame_mode_contract(frame_mode);
try {
result["telemetry"] = Json::parse(telemetry_json.begin(), telemetry_json.end());
} catch (const std::exception&) {
result["telemetry"] = Json::object();
}
result["telemetry"] = Json::parse(telemetry_json.begin(), telemetry_json.end());
return result.dump();
}
std::optional<Gallery_Open_Request> Gallery_Protocol::open_request(std::string_view message) {
Gallery_Request_Result<Gallery_Open_Request> Gallery_Protocol::open_request(std::string_view message) {
Json request;
try {
const Json request = gallery_detail::parse_request(message);
if (!request.is_object() || request.value("category", "") != "event" ||
request.value("type", "") != "gallery_open" ||
!request.contains("case") || !request.at("case").is_string())
return std::nullopt;
const std::string value = request.at("case").get<std::string>();
if (!is_case(value) || !request.contains("frame_mode") ||
!request.at("frame_mode").is_string())
return std::nullopt;
const auto mode = gallery_enum_cast<Gallery_Frame_Mode>(
request.at("frame_mode").get<std::string>());
return mode ? std::optional<Gallery_Open_Request>(Gallery_Open_Request{value, *mode})
: std::nullopt;
} catch (const std::exception&) {
return std::nullopt;
request = gallery_detail::parse_request(message);
} catch (const Json::exception&) {
return {{}, Gallery_Request_Error::invalid_json};
}
if (!request.is_object() || !request.contains("category") ||
!request.at("category").is_string() ||
request.at("category").get_ref<const std::string&>() != "event" ||
!request.contains("type") || !request.at("type").is_string() ||
request.at("type").get_ref<const std::string&>() != "gallery_open")
return {{}, Gallery_Request_Error::wrong_message_type};
if (!request.contains("case") || !request.contains("frame_mode"))
return {{}, Gallery_Request_Error::missing_field};
if (!request.at("case").is_string() || !request.at("frame_mode").is_string())
return {{}, Gallery_Request_Error::invalid_field};
const std::string value = request.at("case").get<std::string>();
const auto mode = gallery_enum_cast<Gallery_Frame_Mode>(
request.at("frame_mode").get_ref<const std::string&>());
if (!is_case(value) || !mode)
return {{}, Gallery_Request_Error::invalid_field};
return {Gallery_Open_Request{value, *mode}, Gallery_Request_Error::none};
}
std::optional<Gallery_Action_Request> Gallery_Protocol::action_request(
Gallery_Request_Result<Gallery_Action_Request> Gallery_Protocol::action_request(
std::string_view message) {
Json request;
try {
const Json request = gallery_detail::parse_request(message);
if (!request.is_object() || request.value("category", "") != "event" ||
request.value("type", "") != "gallery_action" ||
!request.contains("action") || !request.at("action").is_string())
return std::nullopt;
Gallery_Action_Request result{request.at("action").get<std::string>()};
if (request.contains("argument")) {
const Json& argument = request.at("argument");
if (argument.is_boolean())
result.argument = argument.get<bool>();
else if (argument.is_number()) {
const double value = argument.get<double>();
if (!std::isfinite(value))
return std::nullopt;
result.argument = value;
} else if (argument.is_string())
result.argument = argument.get<std::string>();
else
return std::nullopt;
}
return result;
} catch (const std::exception&) {
return std::nullopt;
request = gallery_detail::parse_request(message);
} catch (const Json::exception&) {
return {{}, Gallery_Request_Error::invalid_json};
}
if (!request.is_object() || !request.contains("category") ||
!request.at("category").is_string() ||
request.at("category").get_ref<const std::string&>() != "event" ||
!request.contains("type") || !request.at("type").is_string() ||
request.at("type").get_ref<const std::string&>() != "gallery_action")
return {{}, Gallery_Request_Error::wrong_message_type};
if (!request.contains("action"))
return {{}, Gallery_Request_Error::missing_field};
if (!request.at("action").is_string())
return {{}, Gallery_Request_Error::invalid_field};
Gallery_Action_Request result{request.at("action").get<std::string>()};
if (request.contains("argument")) {
const Json& argument = request.at("argument");
if (argument.is_boolean())
result.argument = argument.get<bool>();
else if (argument.is_number()) {
const double value = argument.get<double>();
if (!std::isfinite(value))
return {{}, Gallery_Request_Error::invalid_field};
result.argument = value;
} else if (argument.is_string())
result.argument = argument.get<std::string>();
else
return {{}, Gallery_Request_Error::invalid_field};
}
return {std::move(result), Gallery_Request_Error::none};
}
std::optional<Gallery_Control_Patch_Request> Gallery_Protocol::control_patch_request(
Gallery_Request_Result<Gallery_Control_Patch_Request> Gallery_Protocol::control_patch_request(
std::string_view message) {
Json request;
try {
const Json request = gallery_detail::parse_request(message);
if (!request.is_object() || request.value("category", "") != "event" ||
request.value("type", "") != "gallery_patch" ||
!request.contains("target") || !request.at("target").is_string() ||
!request.contains("patch") || !request.at("patch").is_object())
return std::nullopt;
return Gallery_Control_Patch_Request{
request.at("target").get<std::string>(), request.at("patch").dump()};
} catch (const std::exception&) {
return std::nullopt;
request = gallery_detail::parse_request(message);
} catch (const Json::exception&) {
return {{}, Gallery_Request_Error::invalid_json};
}
if (!request.is_object() || !request.contains("category") ||
!request.at("category").is_string() ||
request.at("category").get_ref<const std::string&>() != "event" ||
!request.contains("type") || !request.at("type").is_string() ||
request.at("type").get_ref<const std::string&>() != "gallery_patch")
return {{}, Gallery_Request_Error::wrong_message_type};
if (!request.contains("target") || !request.contains("patch"))
return {{}, Gallery_Request_Error::missing_field};
if (!request.at("target").is_string() || !request.at("patch").is_object())
return {{}, Gallery_Request_Error::invalid_field};
return {Gallery_Control_Patch_Request{
request.at("target").get<std::string>(), request.at("patch").dump()},
Gallery_Request_Error::none};
}
bool Gallery_Protocol::action_available(std::string_view case_id,