2012-01-19 60 views
2

在这个例子中:从字符串解析枚举值时避免异常?

try 
{ 
    this.myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), queryStringKeyValue); 
} 
catch (Exception) 
{ 
    this.myEnum = null; 
} 

如何避免受凉一般异常的介绍依赖?我没有收到ReSharper的线索。理想情况下,我想摆脱try/catch。

+0

'this.myEnum =(MyEnum)Enum.Parse(typeof(MyEnum),queryStringKeyValue);' 在那里,我摆脱了你的try/catch。 –

+2

Try Enum.TryParse adatapost

+0

请注意,Enum类型是一个不可为null的值类型,因此您的catch块中的代码将不会实际编译,除非您已指定'this.myEnum'成员的类型为'MyEnum ?',它是'Nullable ' –

回答

3

正如其他人所说的,TryParse方法在失败时返回一个布尔值,而不是抛出异常。但是,看看http://msdn.microsoft.com/en-us/library/essfb559.aspx。它列出了可能抛出的异常,因此不是捕获泛型异常,而是捕获特定的异常,如ArgumentException。该页面上的示例显示了捕获ArgumentException。

+2

完全忽略了TryParse。就是这个方法。 – Richard

+3

感谢您的接受,但我并不是第一个提出建议的人。对其他人投票。他们在我面前说。 –

5

尝试寻找在Enum.TryParse

的TryParse(OF TEnum)(字符串,TEnum)是相同的解析(类型,String)方法,不同之处在于代替抛出异常,则返回如果转换假失败。它在解析枚举值的字符串表示时消除了对异常处理的需要。

3

您可以通过使用Enum.TryParse()(例如,

MyEnum myEnum; 
if (Enum.TryParse<MyEnum>(queryStringKeyValue, out myEnum)) 
{ 
    // successfully parsed enum 
} 
+1

+1的语法糖,用于显示真实世界中的一个很好的示例,以及可应用于许多'TryParse'情境的模式。然而,参考链接会很好。 – 2012-01-19 02:19:31

2

改为使用Enum.TryParse()。它返回一个布尔值来表示成功或失败,并且它是通用的,因此它还可以帮助您节省铸造的时间。

bool success = Enum.TryParse(queryStringKeyValue, out this.myEnum); 

而且,你不应该能够分配null以枚举,假设场实际上不是MyEnum?类型。