C# 错误代码到异常的大规模转换 我有一个低级类,它导入外部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); ... }

C# 错误代码到异常的大规模转换 我有一个低级类,它导入外部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); ... },c#,c++,exception,error-handling,C#,C++,Exception,Error Handling,现在,它有很多方法,它们都返回一个错误代码。我想将这些错误代码封装并转换为异常,即: public static void DoStuff(string parameter) { int error = LowLevel.DoStuff(parameter); if (error != 0) throw new MyException(error); } 有没有一种方法可以在不需要大量复制粘贴的情况下对许多方法执行此操作?总的来说,这是一

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

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

有没有一种方法可以在不需要大量复制粘贴的情况下对许多方法执行此操作?总的来说,这是一个好主意还是有更好的办法?我试图避免将错误代码传递给所有受保护的公共抽象类,从低级到中级再到高级抽象类,在最终显示错误消息等之前,

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

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

至于自动化,允许您基于模式搜索定义快速修复。这至少有助于自动生成一些样板文件

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

代码生成的其他选项至少是VisualStudio知道如何在必要时自动重新生成(尽管在构建文件中不会这样做)。我过去也使用PowerShell生成源代码。在一种情况下,通过查看已编译的程序集并基于特定命名空间中的类型和方法生成代码(通过反射枚举),这在这里也适用于
LowLevel


不过,自动生成的代码有点棘手。如果您需要对生成的代码进行更改,那么您的选项就更少了,或者您需要在源代码管理系统中创造性地使用分部类,或者分支和合并,以避免用重新生成的代码重击手动编写的代码


我的建议是在文件级别上完全分离生成的代码和手写代码。否则只会造成不必要的麻烦。当然,所有这些都假设您可以多次运行代码生成过程。

这就是shell或Perl脚本的用途。对于Linux上的自由软件,这是一种相当常见的方法。源代码通常具有某种元数据文件,采用XML、YAML或自制格式。作为构建代码的一部分,shell或Perl脚本运行它,robo生成声明或数据结构,然后对其进行编译。不幸的是,微软的Windows平台在支持基于脚本的开发工具和偏爱点击式GUI之类的东西方面并没有那么强大。@SamVarshavchik:这完全是胡说八道。将自定义脚本集成到生成过程中,在编译之前生成一些代码是很简单的,甚至在GUI工具(如VisualStudio)中也存在支持。不过,对于问题的最佳解决方案是另一个问题。C++库本质上是一个HW驱动程序,所以所有非零代码都是意外结果,除了可能1-2个每天可能发生的,但是单独处理它们不会使流量控制太差。您对FileNotFoundException提出了一个很好的观点,我想我会手动执行,因为我没有Resharper,其他形式的自动化可能需要同样长的时间来设置。我还可以通过这种方式加倍并消除一些编组(StringBuilder到字符串、Int到Enum等)。这可能取决于有多少方法,手动执行需要多少时间,您对脚本编写的各种选项有多满意,以及执行这些操作需要多少时间。在工作中,我使用代码生成(使用PowerShell和反射)在语法树上自动实现各种访问者实现。当我们添加类或属性时,我们可以简单地重新生成访问者。在本例中,生成器大约需要一天的工作,因此我们不能忘记复制某些属性,等等。我在同一个项目中使用T4生成了一些测试。