你能给我一个实现.NET 'try‘模式的例子吗?
编辑:
我不是指“尝试-捕获”语句,而是指尝试模式,如TryParse()和TryGetObjectByKey()方法中使用的模式。
最具体地说,如何处理自定义“try”模式方法中引发的异常。我应该记录它,我应该忽略它。有人知道这些方法的做法是什么吗?
发布于 2010-10-03 16:02:29
下面是一个使用TryXxx方法的示例:
string s = Console.ReadLine();
int x;
if (int.TryParse(s, out x))
{
Console.WriteLine("You entered the valid integer {0}", x);
}
else
{
Console.WriteLine("Invalid input!");
}下面是定义该方法的一个示例:
bool TryParse(string s, out int x) // out parameter for result
{
if (!allCharactersAreValid(s))
{
x = 0;
return false;
}
// More checks...
// Parse the string...
x = 42;
return true;
}异常处理
最具体地说明如何处理自定义“try”模式方法中上升的异常
您的方法可能应该避免抛出任何异常--如果您的用户需要异常,他们将使用非尝试版本。因此,您应该尽量避免调用在实现TryXxx时可能抛出的方法。然而,有些异常是不可避免的,可能会被抛出您的控制之外-例如OutOfMemoryException,StackOverflowException等.对此您无能为力,您不应该试图捕获这些异常,只要让它们传播到调用方即可。不要吞下它们,不要记录它们--这是来电者的责任。
这方面的一个例子是Dictionary<TKey, TValue>.TryGetValue,当为该方法提供的键对象在调用GetHashCode时抛出异常时。然后,结果异常不会在TryGetValue方法中捕获--调用者将看到异常。此代码演示了这种情况的发生:
using System;
using System.Collections.Generic;
class Foo
{
public override int GetHashCode()
{
throw new NotImplementedException();
}
}
class Program
{
public static void Main()
{
Dictionary<object, object> d = new Dictionary<object, object>();
d["bar"] = 42;
object s;
Foo foo = new Foo();
if (d.TryGetValue(foo, out s)) // results in NotImplementedException
{
Console.WriteLine("found");
}
}
}发布于 2010-10-03 16:14:00
我希望实现在每种情况下都非常类似于“抛出”版本--除非抛出版本中有“抛出新FormatException”语句,否则就会有“返回假”.在成功路径的末尾,有一个输出参数的赋值和“返回真”。
在某种程度上,您可以从非抛出版本中模拟抛出版本(尽管就性能而言,您不能做相反的操作)--如果它返回false,您可以调用TryParse并抛出异常。但是,这意味着异常将不包含解析失败的详细信息。
您能够完成的代码重用的确切数量--同时在Try版本中仍然具有良好的性能,以及抛出版本中的详细异常--将取决于手头的确切任务。
发布于 2010-10-03 16:04:24
我猜你指的是类似于Int32.TryParse或Dictionary<TKey, TValue>.TryGetValue方法的东西。这些方法的存在是为了避免代价高昂的异常抛出,并通过其他方法让调用者知道失败--这种情况下的布尔返回值。
https://stackoverflow.com/questions/3850486
复制相似问题