如果我想说,检查int
是否在两个特定数字之间,是否更好地实现它而没有例外情况如下:
int a; //example in C++, but translate into your language of choice...
cin >> a;
if(a < 0 || a > 5)
cout << "You must enter in a number between 0 and 5 inclusive!" << endl;
或者在try-catch块中有例外吗?
try
{
int a;
cin >> a;
if(a < 0 || a > 5)
throw "You must enter in a number between 0 and 5 inclusive!" << endl;
}
catch(string msg)
{
cout << msg << endl;
}
答案 0 :(得分:2)
两者都不是'更好'。如何处理异常情况,错误等完全取决于代码的确切情况和设计。 Try-catch块非常适用于错误导致以下代码被跳过的情况。另一方面,当你想让用户知道问题但仍然继续,比如假设一个默认值,那么try-catch可能不合适。
此外,某些程序设计有自定义错误处理代码,以便记录和记录错误和异常,并确保程序可以正常失败。如果你正在使用这种系统,你可能根本就不会使用'throw',而是使用类似的东西 ErrorHandler.logError(“出错了!”);
答案 1 :(得分:2)
问题是'函数能否决定如何处理错误/无效/越界输入?'。 如果可以,则不应该引发错误,否则引发错误。
'这是非常特别的吗?'。填满磁盘并导致文件系统错误的磁盘很难知道如何处理。糟糕的用户输入可能不那么罕见,可能可以通过常规代码处理。
异常是一种非常强大的工具,可以让代码重回正轨。但是,它们会破坏代码流,并使常规程序逻辑的可读性降低。
通常情况下,异常会影响调用者函数。在您给出的示例中,您会立即捕获自己的错误 - 因此没有多大意义抛出错误。您可以轻松地打印线并完成它。
在上面的示例中,似乎函数应该能够处理输入错误,因为它还要求数据并知道数据的边界。但这可能并非总是如此,也取决于设计和意图。
答案 2 :(得分:1)
取决于您的目标,并且取决于语言(您将其列为语言无关。)在C ++中,异常非常昂贵,因此您应该小心使用它们。我的规则是,如果错误是用户可见的,那么您可以使用异常。但是,很多人会不同意。基本上有许多不同的思想流派。
在我主要工作的C#世界中,异常非常便宜,因此可以更广泛地使用,用于更广泛的错误处理。
在您给出的特定示例中,它取决于可能导致错误的原因。如果是用户验证错误(似乎是),那么异常就是合适的。如果它是程序流程的正常部分,那么返回代码将更合适。