C# 使用异常处理(可能更改)库的错误代码
假设您正在使用一个返回错误代码的库。您希望为库编写一个包装器,并且希望处理代码中出现异常的错误 如果库仍在由其他人开发中,并且错误代码可能会发生变化(可能会有新的错误代码,也可能会有不推荐的错误代码,或者某些错误代码的含义可能会发生轻微变化),那么您的解决方案是什么 这就是我现在的处境。在我的例子中,这个库是用C++编写的,我们使用的是C。图书馆的编码员说错误代码可能会改变,我必须找到一种方法来处理它 我们的初步解决办法是:C# 使用异常处理(可能更改)库的错误代码,c#,c++,exception-handling,error-handling,libraries,C#,C++,Exception Handling,Error Handling,Libraries,假设您正在使用一个返回错误代码的库。您希望为库编写一个包装器,并且希望处理代码中出现异常的错误 如果库仍在由其他人开发中,并且错误代码可能会发生变化(可能会有新的错误代码,也可能会有不推荐的错误代码,或者某些错误代码的含义可能会发生轻微变化),那么您的解决方案是什么 这就是我现在的处境。在我的例子中,这个库是用C++编写的,我们使用的是C。图书馆的编码员说错误代码可能会改变,我必须找到一种方法来处理它 我们的初步解决办法是: 创建一个包含不同类别错误代码(终端错误、输入错误等)的XML文件 包装
编辑:我已经对错误代码将发生变化这一事实提出了质疑,该库的编码人员表示代码正在开发中。这是一种算法,所以即使是算法的工作方式也会随着原始研究而改变(他正在为此撰写博士论文)。因此,他说可能会有不同的错误,或者将来可能会有一些不相关的错误。考虑到目前的情况,您正在采用的数据驱动方法,使用XML文件,似乎是一种不错的方法。然而,我会质疑为什么错误代码会发生变化——这表明没有对正在开发的库进行适当的设计。它应该为错误代码提供一个定义良好的结构,而不是要求您不断更改对错误代码的解释
您可能希望尝试创建一个整体的“库异常”异常类,并根据库错误的“类型”为要引发的每种不同类型的异常对其进行子类化。至少通过这种方式,您可以捕获所有库错误,即使其中一种特定类型的异常在网络中滑动。例如,在尝试捕获
TerminalErrorException
后,您会捕获类似LibraryException
的内容。如果您希望灵活且不依赖于代码,我认为在第一次运行应用程序时使用反射生成自定义类是最好的。这里是粗略的解释。如果你喜欢,我可以进一步解释。
C++代码的提供者应该创建一个类,它将保存所有错误代码——例如公共类错误{public static只读IOrror=100 }。
当您启动应用程序时,您将检查该类的修改,如果该类被修改,您将为每个错误代码生成异常类。
在上面的示例中,您将生成继承Exception.net类的类IoException。
之后,您可以在包装器中使用它并单独捕获每个异常。
另一个可能的解决方案是修改您提到的xml—对于每个错误代码添加异常类—使用错误代码100的示例,您将拥有IoException类。在这之后,您需要实现并使用这个类…最好贬低旧代码并保留它们的名称,而不是让您的代码名称不断更改。由于您的作者似乎对设计不感兴趣,请他在您可以检索的
stderr
流中报告警告和错误
此外,用代码字符串对构造CSV或XML似乎足够简单,算法编写者可以根据自己的需要自由编辑。为不同类型的错误保留一定范围的代码编号(输入错误为1000秒,终端错误为2000秒,等等),让包装器使用他编写的代码字符串对解释返回代码
然后根据错误类型(由数字范围决定)抛出异常。如果您稍微改变一下对情况的看法,我想您将更容易解决此问题:
//external.
int Say(char* message);
//internal.
///<summary>
/// can throw (CONTRACT): WrongMessageException, SessionTimeOutException
void Say(string message) {
int errorCode = External.Say(message);
//translate error code to either WrongMessageException or to SessionTimeOutException.
}
应用程序中的错误类似于合同。函数的调用者只期望特定的异常情况和特定类型的错误。每个函数都预定义并记录了每个可能的错误,类似于其输入参数和返回值
这对你意味着什么:
//client.
...
try {
Internal.Say("Hello");
}
catch (WrongMessageException wme) {
//deal with wrong message situation.
}
catch (SessionTimeOutException stoe) {
//deal with session timeout situation.
}
category Say [can throw]: { WrongMessageException, SessionTimeOutException }
category WrongMessageException [by error code]: { 100, 101 }
category SessionTimeOutException [by error code]: { 102, 103, 104 }
Public BaseCustomException CreateException(EceptinCategory category, ExceptionDetail detail)
{
var customException = Activator.CreateInstance(category.CustomExceptionType) as BaseCustomException;
customException.SetDetails(detail);
return customException;
}