gpt4 book ai didi

design-patterns - "TryParse/Parse like"模式 : what is the best way to implement it

转载 作者:行者123 更新时间:2023-12-04 02:54:43 25 4
gpt4 key购买 nike

这个问题是 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 并在失败时抛出异常。如果您需要异常中的详细信息,则可能需要更详细的内容。我没有计时异常的大部分性能影响在哪里——如果是抛出而不是创建,你可以编写一个与 TrySomething 具有相似签名但返回异常或 null 的私有(private)方法:

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");
}
}

不过,在你 promise 之前先计时!

关于design-patterns - "TryParse/Parse like"模式 : what is the best way to implement it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/182440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com