为什么普通的 try-catch 在 NX 里可能'失效'?
先别急着写代码,我们得明白一个关键前提:NX 不是你自己的控制台程序。
NX 是一个庞大的商业 CAD 平台,它通过 DLL 加载你的插件,并以函数指针的方式调用你注册的入口(比如菜单回调)。这些调用发生在 NX 主线程中,且其内部并未为第三方代码启用 C++ 异常传播支持。
换句话说:
❌ 你不可以向 NX '抛出'任何 C++ 异常。
哪怕只是一个 std::out_of_range ,只要没被及时捕获,就会导致:
- NX 弹出严重错误对话框;
- 列表窗口空白,无有效提示;
- 调试器难以定位堆栈(尤其 Release 版);
- 最坏情况直接进程终止。
所以答案很明确:所有可能抛出异常的逻辑,必须在进入 NX 调用栈之前就被'消化'掉。
核心策略:建立'异常隔离层'
怎么做?很简单—— 在每一个被 NX 直接调用的函数最外层加一个 try-catch(...) 包裹。
这不是建议,而是强制要求。你可以把它理解为一道'防火墙',把不稳定因素封锁在插件内部。
extern "C" DllExport void user_function(void *param, int *retCode, int paramSize) {
try {
// 所有业务逻辑放在这里
DoRealWork(param);
*retCode = 0; // 成功
} catch (const std::exception& e) {
ReportErrorToUser("[ERROR] Standard exception: " + std::string(e.what()));
}
}

