这个问题是How to indicate that a method was unsuccessful的后续措施。 xxx()Tryxxx()模式在许多库中可能非常有用。我想知道在不重复代码的情况下提供两种实现的最佳方法是什么。
最好的是:
public int DoSomething(string a)
{
// might throw an exception
}
public bool TrySomething(string a, out result)
{
try
{
result = DoSomething(a)
return true;
}
catch (Exception)
{
return false;
}
或者
public int DoSomething(string a)
{
int result;
if (TrySomething(a, out result))
{
return result;
}
else
{
throw Exception(); // which exception?
}
}
public bool TrySomething(string a, out result)
{
//...
}
我本能地认为第一个示例更正确(您确切知道发生了哪个异常),但是try/catch不会太昂贵吗?在第二个示例中,是否有办法捕获异常?
最佳答案
使TrySomething只是捕获并吞没异常是一个非常糟糕的主意。 TryXXX模式的一半是避免对性能的影响。
如果在异常中不需要太多信息,则可以使DoSomething方法仅调用TrySomething并在失败时引发异常。如果您需要异常(exception)的详细信息,则可能需要更详细的说明。我还没有计时到异常对性能的影响最大的地方-如果是抛出而不是创建,则可以编写一个私有(private)方法,该方法的签名与TrySomething类似,但是返回的异常或null:
public int DoSomething(string input)
{
int ret;
Exception exception = DoSomethingImpl(input, out ret);
if (exception != null)
{
// Note that you'll lose stack trace accuracy here
throw exception;
}
return ret;
}
public bool TrySomething(string input, out int ret)
{
Exception exception = DoSomethingImpl(input, out ret);
return exception == null;
}
private Exception DoSomethingImpl(string input, out int ret)
{
ret = 0;
if (input != "bad")
{
ret = 5;
return null;
}
else
{
return new ArgumentException("Some details");
}
}
在确定时间之前,先确定时间!