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
相关产品推荐
相关产品推荐

