Skip to content

Commit 9d00f24

Browse files
authored
Handle exceptions in C bindings (#3246)
* handle exceptions in interactor_c_api * handle exceptions in options_c_api * handle exceptions in utils_c_api
1 parent 112f499 commit 9d00f24

7 files changed

Lines changed: 485 additions & 132 deletions

File tree

c/interactor_c_api.cxx

Lines changed: 69 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,14 @@ void f3d_interactor_add_command(f3d_interactor_t* interactor, const char* action
380380
callback(c_args.data(), static_cast<int>(c_args.size()), user_data);
381381
};
382382

383-
cpp_interactor->addCommand(action, cpp_callback);
383+
try
384+
{
385+
cpp_interactor->addCommand(action, cpp_callback);
386+
}
387+
catch (const f3d::interactor::already_exists_exception& ex)
388+
{
389+
f3d::log::error(ex.what());
390+
}
384391
}
385392

386393
//----------------------------------------------------------------------------
@@ -437,7 +444,15 @@ int f3d_interactor_trigger_command(
437444
}
438445

439446
f3d::interactor* cpp_interactor = reinterpret_cast<f3d::interactor*>(interactor);
440-
return cpp_interactor->triggerCommand(command, keep_comments != 0) ? 1 : 0;
447+
try
448+
{
449+
return cpp_interactor->triggerCommand(command, keep_comments != 0) ? 1 : 0;
450+
}
451+
catch (const f3d::interactor::command_runtime_exception& ex)
452+
{
453+
f3d::log::error(ex.what());
454+
return 0;
455+
}
441456
}
442457

443458
//----------------------------------------------------------------------------
@@ -477,8 +492,15 @@ void f3d_interactor_add_binding(f3d_interactor_t* interactor, const f3d_interact
477492

478493
std::string cpp_group = group ? group : "";
479494

480-
cpp_interactor->addBinding(cpp_bind, cpp_commands, cpp_group, nullptr,
481-
static_cast<f3d::interactor::BindingType>(type), notify != 0);
495+
try
496+
{
497+
cpp_interactor->addBinding(cpp_bind, cpp_commands, cpp_group, nullptr,
498+
static_cast<f3d::interactor::BindingType>(type), notify != 0);
499+
}
500+
catch (const f3d::interactor::already_exists_exception& ex)
501+
{
502+
f3d::log::error(ex.what());
503+
}
482504
}
483505

484506
//----------------------------------------------------------------------------
@@ -542,24 +564,32 @@ f3d_interaction_bind_t* f3d_interactor_get_binds_for_group(
542564
}
543565

544566
const f3d::interactor* cpp_interactor = reinterpret_cast<f3d::interactor*>(interactor);
545-
std::vector<f3d::interaction_bind_t> binds = cpp_interactor->getBindsForGroup(group);
546-
547-
*count = static_cast<int>(binds.size());
548-
if (binds.empty())
567+
try
549568
{
550-
return nullptr;
551-
}
569+
std::vector<f3d::interaction_bind_t> binds = cpp_interactor->getBindsForGroup(group);
552570

553-
f3d_interaction_bind_t* result = new f3d_interaction_bind_t[binds.size()];
571+
*count = static_cast<int>(binds.size());
572+
if (binds.empty())
573+
{
574+
return nullptr;
575+
}
554576

555-
for (size_t i = 0; i < binds.size(); ++i)
577+
f3d_interaction_bind_t* result = new f3d_interaction_bind_t[binds.size()];
578+
579+
for (size_t i = 0; i < binds.size(); ++i)
580+
{
581+
result[i].mod = static_cast<f3d_interaction_bind_modifier_keys_t>(binds[i].mod);
582+
std::strncpy(result[i].inter, binds[i].inter.c_str(), sizeof(result[i].inter) - 1);
583+
result[i].inter[sizeof(result[i].inter) - 1] = '\0';
584+
}
585+
586+
return result;
587+
}
588+
catch (const f3d::interactor::does_not_exists_exception& ex)
556589
{
557-
result[i].mod = static_cast<f3d_interaction_bind_modifier_keys_t>(binds[i].mod);
558-
std::strncpy(result[i].inter, binds[i].inter.c_str(), sizeof(result[i].inter) - 1);
559-
result[i].inter[sizeof(result[i].inter) - 1] = '\0';
590+
f3d::log::error(ex.what());
591+
return nullptr;
560592
}
561-
562-
return result;
563593
}
564594

565595
//----------------------------------------------------------------------------
@@ -609,13 +639,20 @@ void f3d_interactor_get_binding_documentation(f3d_interactor_t* interactor,
609639
cpp_bind.mod = static_cast<f3d::interaction_bind_t::ModifierKeys>(bind->mod);
610640
cpp_bind.inter = bind->inter;
611641

612-
auto [doc_str, value_str] = cpp_interactor->getBindingDocumentation(cpp_bind);
642+
try
643+
{
644+
auto [doc_str, value_str] = cpp_interactor->getBindingDocumentation(cpp_bind);
613645

614-
std::strncpy(doc->doc, doc_str.c_str(), sizeof(doc->doc) - 1);
615-
doc->doc[sizeof(doc->doc) - 1] = '\0';
646+
std::strncpy(doc->doc, doc_str.c_str(), sizeof(doc->doc) - 1);
647+
doc->doc[sizeof(doc->doc) - 1] = '\0';
616648

617-
std::strncpy(doc->value, value_str.c_str(), sizeof(doc->value) - 1);
618-
doc->value[sizeof(doc->value) - 1] = '\0';
649+
std::strncpy(doc->value, value_str.c_str(), sizeof(doc->value) - 1);
650+
doc->value[sizeof(doc->value) - 1] = '\0';
651+
}
652+
catch (const f3d::interactor::does_not_exists_exception& ex)
653+
{
654+
f3d::log::error(ex.what());
655+
}
619656
}
620657

621658
//----------------------------------------------------------------------------
@@ -631,8 +668,16 @@ f3d_interactor_binding_type_t f3d_interactor_get_binding_type(
631668
f3d::interaction_bind_t cpp_bind;
632669
cpp_bind.mod = static_cast<f3d::interaction_bind_t::ModifierKeys>(bind->mod);
633670
cpp_bind.inter = bind->inter;
634-
f3d::interactor::BindingType cpp_type = cpp_interactor->getBindingType(cpp_bind);
635-
return static_cast<f3d_interactor_binding_type_t>(cpp_type);
671+
try
672+
{
673+
f3d::interactor::BindingType cpp_type = cpp_interactor->getBindingType(cpp_bind);
674+
return static_cast<f3d_interactor_binding_type_t>(cpp_type);
675+
}
676+
catch (const f3d::interactor::does_not_exists_exception& ex)
677+
{
678+
f3d::log::error(ex.what());
679+
return F3D_INTERACTOR_BINDING_OTHER;
680+
}
636681
}
637682

638683
//----------------------------------------------------------------------------

c/interactor_c_api.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ extern "C"
247247
* @param group Group name.
248248
* @param count Output parameter for number of binds.
249249
* @return Array of binds. Caller must free the array with
250-
* f3d_interactor_free_bind_array().
250+
* f3d_interactor_free_bind_array(). NULL if group does not exist.
251251
*/
252252
F3D_EXPORT f3d_interaction_bind_t* f3d_interactor_get_binds_for_group(
253253
f3d_interactor_t* interactor, const char* group, int* count);
@@ -287,7 +287,7 @@ extern "C"
287287
*
288288
* @param interactor Interactor handle.
289289
* @param bind Interaction bind.
290-
* @return Binding type.
290+
* @return Binding type. F3D_INTERACTOR_BINDING_OTHER if bind does not exist.
291291
*/
292292
F3D_EXPORT f3d_interactor_binding_type_t f3d_interactor_get_binding_type(
293293
f3d_interactor_t* interactor, const f3d_interaction_bind_t* bind);

0 commit comments

Comments
 (0)