这是一个非常普遍且可能很常见的问题,但我在网上找不到答案。
我正在寻找一种合理的方法来为某个应用程序创建一个状态代码,该代码可能在某些方面失败但在其他方面仍然成功。
让我们说我有一个应用程序运行一些算法。 在我们得到结果后,该应用程序应该做3件事:
我需要创建一个状态代码,其中包含每个独立步骤的状态,并且可以指示单个或多个故障。
有什么常见的做法吗?
答案 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");
}
}