You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#封装C++库时如何将GetLastError错误码注入自定义异常?

C#封装原生库异常转换方案相关问题

背景说明

我手头有一个专有C#库,本质是对部分C++代码的封装,对外提供的函数格式如下:

public int func(in params, out params...)

返回的int值有三类含义:0代表成功,小于0为错误码,大于0为有效数据(例如成功读取的字节数)。此外该库还提供public EnumErrorCode GetLastError()方法。

我的任务是在此基础上再做一层封装,将返回错误码的函数改造为抛出异常的形式。目前我已经实现了将返回值注入自定义异常的逻辑,代码如下:

public class MyException : Exception
{
    public int RetVal { get; }
    public MyException(int retVal) { RetVal = retVal;}
    public MyException(string message, int retVal) : base(message) { RetVal = retVal; }
}

调用方式如下:

public void func(int a)
{
    var retVal = api.func(a);
    switch (retVal)
    {
        case 0: return;
        case -1: throw new MyException("全局通用错误", retVal);
        case -2: throw new MyException("当前函数专属错误", retVal);
        default: throw new MyException(retVal);
    }
}

待解决的问题

  • 我应该在自定义异常中新增public EnumErrorCode ErrorCode { get; }属性直接使用原库定义的EnumErrorCode类型,还是仅存储int类型的错误码?
  • 抛出异常时直接调用GetLastError()是否合理?示例代码如下:
case -1: throw new MyException("未知错误!", retVal, GetLastError());

我认为抛出异常时调用外部未知代码不太妥当,请问还有哪些可行的实现方案?

最终实现方案

结合建议,最终决定将API文档提供的函数专属错误信息整合进来,同时在异常工厂的Create方法中使用字典做EnumErrorCode的映射,实现代码如下:

public interface IMyExceptionFactory
{
    MyException Create(string funcSpecificCodeMsg, int returnCode, int errorCode);
}

// 其他实现代码省略
int returnCode = CallToThirdParty();
if (returnCode < 0)
{
    int errorCode = -1;
    try
    {
        errorCode = (int)GetLastError();
    }
    catch (Exception) { }
    switch (returnCode)
    {
        case -1: throw _exceptionFactory.Create("无效句柄", returnCode, errorCode);
        case -2: throw _exceptionFactory.Create("函数专属错误-2", returnCode, errorCode);
            // 其他错误码分支省略
        default: throw _exceptionFactory.Create("未知返回码", returnCode, errorCode);
    }
    
}

内容的提问来源于stack exchange,提问作者downforme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:45:03