[英]Best practice for TryGet method style
我有一个枚举方法,如下所示:
public static TEnum GetEnumByStringValue<TEnum>(string value) where TEnum : struct, IConvertible, IComparable, IFormattable
{
if(!typeof(TEnum).IsEnum)
{
throw new ArgumentException("TEnum must be an enumerated type.");
}
Type type = typeof(TEnum);
FieldInfo[] fieldInfos = type.GetFields();
foreach (FieldInfo fieldInfo in fieldInfos)
{
StringValue[] stringValues = fieldInfo.GetCustomAttributes(typeof(StringValue), false) as StringValue[];
if (stringValues != null)
{
foreach (StringValue stringValue in stringValues)
{
if (stringValue.Value.Equals(value))
{
return (TEnum)Enum.Parse(typeof(TEnum), fieldInfo.Name);
}
}
}
}
throw new ArgumentOutOfRangeException("value", "Value was not found in enum's string values.");
}
我想实现一个TryGetEnumByStringValue
,它返回true或false,而不是抛出类似于int.Parse
和int.TryParse
概念的int.TryParse
。 我看到它的方式,在我的新方法中,我可以调用我的另一个,捕获异常(如果有的话)并相应地返回,或者我可以重构现有的返回bool
并再次在我的新方法中简单地调用现有的如果返回false则抛出异常。
如果我选择选项2,我会丢失确切的异常详细信息,如果我选择选项1,则仍会抛出异常(我总是被教导异常很慢)。
我还可以重构现有的一个bool
指示是否抛出异常,但这并不适合我。
对于这种方法风格或模式,我是否错过了一颗智慧之珠?
如果你已经有抛出的方法,那么很容易使用它来Try...
它Try...
变种!惊喜! try/catch
:
public bool TryReturnSomething(..., out SomeType result) // ... - parameters
{
try
{
result = ReturnSomething();
return true;
}
catch(SomeException1 e) { } // catch all expected exception types
catch(SomeException2 e) { }
return false;
}
查看消息来源,您会发现miscrosoft确实使用了一种模式 。 它们具有内部方法,该方法使用经过验证的参数调用。 并且通过Try...
和普通变体单独完成验证。 参见double.Parse()和double.TryParse() ,第一个将在验证时throw
而其他将返回false。
因此,如果您可以创建一个由两个变体调用的私有方法。 此方法不应验证任何内容(可能会引发异常)并在公共变体中调用此方法,这两种方法都验证参数( Try..
return false和其他throws)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.