将错误代码批量转换为异常

本文关键字:异常 转换 错误代码 | 更新日期: 2023-09-27 18:31:52

我有一个导入外部C++函数的低级类,例如:

public static class LowLevel
{
    [DllImport("DLLName.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern int DoStuff([MarshalAs(UnmanagedType.LPStr)] string parameter);
    [DllImport("DLLName.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern int DoStuff2(int parameter);
    ...
}

现在,它有很多方法,所有方法都返回错误代码。我想封装这些错误代码并将其转换为异常,即:

public static void DoStuff(string parameter)
{
        int error = LowLevel.DoStuff(parameter);
        if (error != 0)
            throw new MyException(error);
}

有没有办法在没有大量复制粘贴的情况下为很多方法做到这一点?总的来说,这甚至是一个好主意还是有更好的方法?我试图避免在最终显示错误消息等之前,必须通过所有受保护的公共、低级到中级到高级抽象类传递错误代码。

将错误代码批量转换为异常

对于每个实例,您可能应该问自己的一件事是,非零返回值是否实际上等同于异常或预期结果。并非每个具有不同结果的方法都使用这些方法来传达异常情况,如果您将这些结果映射到异常中,则流控制会得到......奇怪。

您的包装器看起来不错(我猜缺少文档)。我可能会做的一件事是根据失败代码的含义使用合理的异常,例如抛出FileNotFoundException而不是MyException(2)。但是,这几乎排除了任何自动化方法。

至于自动化,ReSharper允许您根据模式搜索定义快速修复。这至少可以帮助自动生成一些样板。

另一种选择是Roslyn,Microsoft的开源C#编译器框架。Visual Studio 2015允许你使用Roslyn的API编写快速修复程序,如果你想在IDE中集成一些东西(类似于ReSharper提供的我上面提到的)。但您也可以使用这些库编写一个小工具来生成适当的粘合代码。

代码生成的其他选项是T4模板,至少Visual Studio知道如何在必要时自动重新生成(尽管这不会在构建文件中完成)。我过去也使用PowerShell来生成源代码。在一种情况下,通过查看已编译的程序集并根据某个命名空间中的类型和方法生成代码(通过反射枚举),这也可以在这里与您的LowLevel类一起使用。


不过,自动生成的代码有点棘手。如果需要对生成的代码进行更改,则选项较少,或者需要创造性地使用分部类或分支和源代码管理系统中的合并,以避免将手动编写的代码与重新生成的代码混为一谈。

我的建议是在文件级别将生成的代码与手写代码完全分开。否则只会造成不必要的头痛。当然,所有这些都假设您可以更频繁地运行代码生成过程,而不仅仅是一次。

相关文章: