我问这个:Is it bad to use exceptions to end function?。
现在我知道我们不应该返回异常。那么,返回错误的正确方法是什么?
当我返回异常时,当某些内容失败时,我知道函数内部的错误是什么。
但是如果是一个带有多个异常的void函数,我有一个布尔函数,如果它没有,则返回true,如果某些内容失败,则返回false,我怎么知道失败的确切内容呢?
一个函数可能由于多种原因而失败,因此对于我的程序来说,只返回一个False是不行的。当我返回带有一些文本的Exception时,我可以向用户显示确切的错误。
有一个字符串函数返回像“正确”这样的单词或不同的错误对我来说不是最好的事情。 推荐的方法是什么?
答案 0 :(得分:2)
“......我怎么知道失败的确切事情?”
提出这个问题可能意味着你在方法中有太多的事情需要重构。
这是你的例子,复制自上一个问题:
void Function1()
{
//Do something...
//If something fail
Throw New Exception("Fails because bla bla");
//Do something...
//If something fail
Throw New Exception("Fails because bla bla bla bla");
//If everything its ok, just continue without throwing anything
}
Function1正在做很多事情。为了使维护(和测试)更容易,您可以将逻辑组提取到单独的方法中,每个方法返回一个bool
值以表示成功。
bool SomethingOne()
{
var successful = true;
//Do something...
//If something fail
successful = false;
return successful;
}
bool SomethingTwo()
{
var successful = true;
//Do something...
//If something fail
successful = false;
return successful;
}
void Function1()
{
var isOneSuccessful = SomethingOne();
if (!isOneSuccessful)
{
// SomethingOne failed - do something
return;
}
var isTwoSuccessful = SomethingTwo();
if (!isTwoSuccessful)
{
// SomethingTwo failed - do something
return;
}
//If everything its ok, just continue without throwing anything
}
YMMV。我假设“失败的东西”是一个非关键问题。也许这可能是一个验证例程,你只是要显示一条消息“请检查所有字段。”
如果使用您的方法的程序员需要特别注意和处理,或者用户必须了解更多信息,那么一个简单的布尔值可能不会削减它。
答案 1 :(得分:1)
根据您的要求,建议的方法会有很大差异。
我们在一个非常大的系统中实现它的方式是将结构化错误类作为方法的参数之一或作为方法的返回包含,具体取决于需要。
此错误类包含错误代码,以便我们可以执行众所周知的错误的翻译,用于保存用户可使用消息的消息字符串,以及可用于指示可重试性,死亡率等的各种标志。
我们在应用程序的所有级别使用此错误类,从应用程序服务器到移动设备和Web服务方法。
这只是我们的方法,对我们来说效果很好,但您的实施可能需要采用不同的方法。