【发布时间】:2008-10-08 12:18:23
【问题描述】:
这个问题是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 不会太昂贵吗?有没有办法在第二个例子中捕获异常?
【问题讨论】:
-
我同意您的直觉(如果可能,请避免 TryX 案例的异常)只要您的 TryX 实现不必捕获异常(即异常是由您的代码,而不是您调用的代码)。
-
另外,我不确定您所说的“有没有办法在第二个示例中捕获异常?” -- 捕捉到什么异常?你想从 DoSomething 中抛出(尽管你会抛出一个特定于所发生事件的异常,而不是一般异常)。
-
@Jonathan:我的意思是“以调用者知道是什么原因导致错误的方式重新抛出内部处理中发生的异常”
标签: design-patterns return-value try-catch