这个问题是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");
    }
}

在确定时间之前,先确定时间!

09-15 23:00