Ответ 1
Вот пример использования метода 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
. Затем полученное исключение не попадает внутрь метода 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");
}
}
}