【问题标题】:Understanding the try-block了解 try 块
【发布时间】:2015-03-24 04:47:31
【问题描述】:

我正在学习 C++ 2 个月,但在理解 C++ 中的 try-catch 块时遇到了一些问题。我正在使用这本书:编程原理和使用 C++ 的实践,这是我的书所说的:

异常的基本思想是,如果一个函数 find 是一个它无法处理的错误,它不会正常返回,而是抛出一个异常,指出哪里出了问题。任何直接或间接调用者都可以catch异常,即指定如果被调用的代码使用throw怎么办。

“任何直接或间接调用者都可以捕获异常是什么意思?作者是指函数的调用者还是捕获函数?”。我对此感到困惑,你能用简单的方式向我解释一下吗?

【问题讨论】:

  • 请注意,您选择了唯一的答案,但您问题中的引用是关于函数的直接或间接调用者。间接意味着调用者调用foo(),然后调用bar()。 bar() 抛出,foo() 不捕获,但调用者可以捕获。答案中的示例缺少一个函数调用。
  • @juanchopanza 你能用更详细的评论向我解释一下吗?没听懂,抱歉。
  • 我不知道该怎么解释。答案有一个直接的函数调用(它称为“间接”),根本没有函数调用(它称为“直接”。)
  • @juanchopanza 为什么错误检查应该在函数调用中进行(在函数的情况下)并且错误处理应该在调用函数中进行?
  • 不必如此。但这就是引文所说的。它正在讨论函数调用以及这些函数的调用者在哪里完成错误处理。

标签: c++ exception error-handling try-catch error-checking


【解决方案1】:

间接调用示例: 这里异常发生在被调用的函数中。但是try catch是放在调用函数中的,而不是被调用函数中。

#include <iostream>
#include <exception>

using namespace std;
void divideByZero(){
    int a = 5;

    int b = a / 0;
    throw(b);
}
int main()
{
    try{
        divideByZero();
    }
    catch (exception& e){
        cout<<e.what()<<endl;
    }

    return 0;
}

直接异常示例: 这里的异常直接发生在函数本身中,并在那里自己处理。

#include <iostream>
using namespace std;

int main()
{
    try{
        int a = 5;
        int b = a / 0;
        throw(b);
    }
    catch (exception& e){
        cout<<e.what()<<endl;
    }

    return 0;
}

以上程序仅用于说明,不用于任何实际示例,您在编写有用的程序时可能会遇到。

【讨论】:

  • 嗯,它可能。这是未定义的行为。举一个行为明确的例子当然会更好。
  • @BenjaminLindley 正确,正确的做法是说“标准没有指定在这种情况下抛出异常”
  • 您的“间接”示例实际上是直接的。您的“直接”示例甚至没有函数调用。你需要多一层的函数调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多