您能举例说明.NET'try'模式的实现吗?
修改
我不是指“try-catch”语句,我的意思是尝试模式,如TryParse()
和TryGetObjectByKey()
方法中使用的模式。
更具体地说,在自定义'try'模式方法中如何处理引发异常。如果我记录它,我应该忽略它。 “有人知道这些方法的做法是什么?”
答案 0 :(得分:33)
以下是使用 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'模式方法中的上升异常
您的方法可能应避免抛出任何异常 - 如果您的用户需要例外,他们将使用非Try版本。因此,您应该尽量避免调用在实现TryXxx时可能抛出的方法。但是有些例外情况是不可避免的,可能会被你的控制权所取代 - 例如OutOfMemoryException
,StackOverflowException
等......你无能为力,你不应该试图捕捉这些例外情况,让他们传播给来电者。不要吞下它们,不要记录它们 - 这是来电者的责任。
当提供给此方法的密钥对象在调用Dictionary<TKey, TValue>.TryGetValue
时抛出异常时,此示例为GetHashCode
。然后,导致的异常是{em> not 在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");
}
}
}
答案 1 :(得分:10)
我希望实现看起来非常像每个案例中的“抛出”版本 - 除非在抛出版本中有“抛出新的FormatException”语句,有“返回false”......并且最后在成功路径中,有一个对输出参数的赋值和“return true”。
要某些范围,你可以模拟非投掷版本的投掷版本(虽然在性能方面你不能反过来) - 你可以只是如果返回false,则调用TryParse
并抛出异常。但是,这意味着该异常不会包含有关解析失败原因的详细信息。
您可以完成的代码重用的确切数量 - 虽然仍然具有Try版本的良好性能,以及抛出版本中的详细异常 - 将取决于手头的确切任务。
答案 2 :(得分:2)
我猜您的意思是Int32.TryParse
或Dictionary<TKey, TValue>.TryGetValue
方法。这些方法可以避免代价高昂的异常抛出,让调用者通过其他方式知道失败 - 在这种情况下是布尔返回值。