Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用异常处理(可能更改)库的错误代码_C#_C++_Exception Handling_Error Handling_Libraries - Fatal编程技术网

C# 使用异常处理(可能更改)库的错误代码

C# 使用异常处理(可能更改)库的错误代码,c#,c++,exception-handling,error-handling,libraries,C#,C++,Exception Handling,Error Handling,Libraries,假设您正在使用一个返回错误代码的库。您希望为库编写一个包装器,并且希望处理代码中出现异常的错误 如果库仍在由其他人开发中,并且错误代码可能会发生变化(可能会有新的错误代码,也可能会有不推荐的错误代码,或者某些错误代码的含义可能会发生轻微变化),那么您的解决方案是什么 这就是我现在的处境。在我的例子中,这个库是用C++编写的,我们使用的是C。图书馆的编码员说错误代码可能会改变,我必须找到一种方法来处理它 我们的初步解决办法是: 创建一个包含不同类别错误代码(终端错误、输入错误等)的XML文件 包装

假设您正在使用一个返回错误代码的库。您希望为库编写一个包装器,并且希望处理代码中出现异常的错误

如果库仍在由其他人开发中,并且错误代码可能会发生变化(可能会有新的错误代码,也可能会有不推荐的错误代码,或者某些错误代码的含义可能会发生轻微变化),那么您的解决方案是什么

这就是我现在的处境。在我的例子中,这个库是用C++编写的,我们使用的是C。图书馆的编码员说错误代码可能会改变,我必须找到一种方法来处理它

我们的初步解决办法是:

  • 创建一个包含不同类别错误代码(终端错误、输入错误等)的XML文件
  • 包装器在启动时获取这些错误代码
  • 通过检查错误代码的类别来引发相应的异常
  • 假设一个方法返回错误代码100,然后包装器检查错误代码的类别。如果是终端错误,则抛出终端错误异常;如果是用户输入错误,则抛出用户输入错误异常

    这应该行得通,但我觉得这不是最佳解决方案。我想知道编写好的企业软件如何处理错误代码的更改

    你建议做什么


    编辑:我已经对错误代码将发生变化这一事实提出了质疑,该库的编码人员表示代码正在开发中。这是一种算法,所以即使是算法的工作方式也会随着原始研究而改变(他正在为此撰写博士论文)。因此,他说可能会有不同的错误,或者将来可能会有一些不相关的错误。

    考虑到目前的情况,您正在采用的数据驱动方法,使用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.
    }
    
    应用程序中的错误类似于合同。函数的调用者只期望特定的异常情况和特定类型的错误。每个函数都预定义并记录了每个可能的错误,类似于其输入参数和返回值

    这对你意味着什么:

  • 定义内部框架的最终设计(越快越好)
  • 决定内部框架的每个函数可以抛出什么类型的错误
  • 使用客户端应用程序中的内部框架,只期望预期和记录的异常。不要尝试/c
    //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;
    }