【问题标题】:Handling Exceptions of a c++ DLL处理 c++ DLL 的异常
【发布时间】:2020-04-07 15:11:10
【问题描述】:

我正在制作一个游戏引擎,我已经为脚本编写了一个 c++ 热重载,但我遇到了一个问题。问题是,如果用户犯了错误,脚本崩溃了,引擎也会崩溃。 有 2 个项目,第一个是 exe(引擎),另一个是 dll,用户可以修改和添加任何他想要的脚本。

是否可以在 dll 函数中捕获错误以使我的引擎也不会崩溃?

类似这样的:

auto item = current_scripts.begin();
for (; item != current_scripts.end(); ++item) {
    if (*item != nullptr) {
            try {
                // I would like to be able to catch all possible errors/exceptions the user might do
                throw (*item)->Update();  
                // this is calling a dll function that the exe does not know what is doing
            }
            catch(...) {
                LOG("Error In Update");
            }
        }
    }

【问题讨论】:

    标签: c++ exception dll game-engine hot-reload


    【解决方案1】:

    是否可以在 dll 函数中捕获错误以使我的引擎也不会崩溃?

    这取决于 DLL 的制作方式以及您使用的 API 类型。

    通常,您应该在 extern "C" 块中声明 DLL 函数,这会强制将函数导出为 C 风格的 API。 C 没有任何内置的异常概念和try/catch,因此您必须在 DLL 内部构建自己的错误处理,并以 C 兼容的方式在 DLL 外部引发错误。

    如果您不使用extern "C" 来包装您的 DLL API,则它被视为 C++ API。正确执行这些操作非常棘手,并且只有在为 EXE 和 DLL 链接 完全相同 C++ 运行时,才能在 DLL 之外捕获 std::exception
    如果不是这种情况,您必须再次捕获 DLL 内部的异常,并以 C 兼容的方式在 DLL 外部引发错误。

    最后,使用托管 C++ 或 C# 构建的 DLL 允许您捕获 DLL 之外的异常。此功能由Common Language Runtime 提供。


    我建议您考虑将您的项目迁移到 Managed C++ 以利用它提供的便利。

    另一个解决方案是为用户提供某种样板代码,在每个 DLL API 函数中实现 try/catch。然后指示用户修改封装的函数。

    extern "C"
    {
      __declspec(dllexport) int __cdecl MyFunction(void)
      {
        try
        {
          MyFunctionImpl();
          return 0; // Return a success code
        }
        catch (...)
        {
          return 1; // Return an error code
        }
      }
    }
    
    void MyFunctionImpl(void)
    {
      // User implements custom scripting here...
    }
    
    

    【讨论】:

      猜你喜欢
      • 2012-12-03
      • 1970-01-01
      • 2017-04-22
      • 2018-03-06
      • 2011-09-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多