定义退货状态代码

时间:2015-11-17 14:20:52

标签: c#

这是一个非常普遍且可能很常见的问题,但我在网上找不到答案。

我正在寻找一种合理的方法来为某个应用程序创建一个状态代码,该代码可能在某些方面失败但在其他方面仍然成功。

让我们说我有一个应用程序运行一些算法。 在我们得到结果后,该应用程序应该做3件事:

  1. 通过电子邮件发送结果
  2. 将结果保存到Db
  3. 将结果发送到另一个集成的外国应用程序。
  4. 我需要创建一个状态代码,其中包含每个独立步骤的状态,并且可以指示单个或多个故障。

    有什么常见的做法吗?

4 个答案:

答案 0 :(得分:6)

你应该使用Flag Enum:

[Flags]
public enum Options 
{
  None    = 0,
  Option1 = 1,
  Option2 = 2,
  Option3 = 4,
  Option4 = 8
}

https://msdn.microsoft.com/library/ms229062(v=vs.100).aspx

在这里你可以找到.HasFlag的一些不错的例子 https://msdn.microsoft.com/en-us/library/system.enum.hasflag(v=vs.110).aspx

在你的情况下,它可能是这样的(它可以扩展到当然,它实际上取决于你的设计和要求):

[Flags]
public enum ReturnStatus
{
  NoErrors = 0,
  DBError = 1,
  ThirdPartyError = 2,
  EmailError = 4,
  EmailSend = 8 
  //This could also be an option, so i just added it here as example, but i'm a bit confused if this is used as a return status or the current state of a task
  //Example: when database failed, and the algorithm doesn't event attempts to send a mail, and when you want to rerun a task it could be usefull
}

ReturnStatus ret = ReturnStatus.DBError | ReturnStatus.EmailError;

if( ret.HasFlag(ReturnStatus.EmailError) ) {
  //Email failed to send
}
if( ret.HasFlag(ReturnStatus.DBError) ) {
  //Db save failed
}

答案 1 :(得分:2)

使用标记,请参阅this

例如:

[Flags]
public enum ReturnCode
{
   RESULT1 = 0x1,
   RESULT2 = 0x2,
   RESULT3 = 0x4
}

然后在你的回归中:

return (ReturnCode.RESULT1 | ReturnCode.RESULT3);

答案 2 :(得分:1)

您可以使用枚举,其中将0定义为成功,然后将每个可能的错误条件定义为更多值。当操作是连续的时,这很好,即如果第一步失败,它不会尝试进行第二步和第三步。

如果步骤是独立的,那么您可以考虑使用位编码值来指示错误状态。零意味着再次成功。如果设置了位1,则步骤1失败;第2步,第2步等等。

答案 3 :(得分:1)

对每个独立步骤和标志使用枚举:

public enum MailStatus 
{
    Ok  = 1,
   Bad = 2
}

public enum DbStatus 
{
    Ok  = 4,
    Bad = 8
}

public static void Main()
{
    var mailStatus = MailStatus.Ok;
    var dbStatus = DbStatus.Ok;
    var status = (int)mailStatus | (int)dbStatus;
    // Example: we test if status matches with EmailStatus.Ok
    if ((status & (int)MailStatus.Ok) != 0)
    {
        Console.WriteLine("Ok");
    }
}