#498. 异常捕获练习

异常捕获练习

一、选择题

  1. 在 C++ 中,关于异常处理的描述,下列哪项是正确的?

{{ select(1) }}

  • throw 关键字必须在 try 块内部直接使用,不能出现在函数调用中。
  • 异常处理机制的主要目的是取代所有的 if-else 判断语句。
  • 一旦执行了 throw 语句,程序会立即跳转到匹配的 catch 块,try 块中随后的代码将被跳过。
  • catch·` 块执行完毕后,程序会自动回到 throw 语句的下一行继续执行。
  1. 观察以下代码,输出结果是:
try {
    cout << "Start ";
    throw 10.5;
    cout << "End ";
} catch (int e) {
    cout << "Int ";
} catch (...) {
    cout << "All ";
}
cout << "Finish";

{{ select(2) }}

  • Start Int Finish
  • 程序崩溃,因为没有匹配的 double 捕获块
  • Start All Finish
  • Start End Finish
  1. 如果一个异常在抛出后,经过所有嵌套函数调用都没有找到匹配的 catch 块,程序最终会调用哪个函数?

{{ select(3) }}

  • std::terminate()
  • std::exit()
  • std::abort()
  • main()
  1. 关于“全捕获”语句 catch (...),下列说法错误的是:

{{ select(4) }}

  • catch (...) 块内部,通常无法获取异常的具体数值或对象。
  • 在一个 try 块后,它可以出现在多个 catch 块的最前面。
  • 它可以捕获任何类型的异常。
  • 它常用于防御性编程,作为最后一道防线防止程序崩溃。
  1. 在跨函数捕获中,异常向上层传递时,原函数中已构造的局部变量会发生什么?

{{ select(5) }}

  • 自动调用析构函数进行销毁(栈解旋)。
  • 被强制转换为全局变量以便上层访问。
  • 状态被冻结,等 catch 结束后恢复执行。
  • 继续保留在内存中,直到程序结束。
  1. 下列哪种情况最适合使用异常处理机制而非简单的 if 判断?

{{ select(6) }}

  • 检查用户输入的年龄是否为负数。
  • 循环语句中判断是否达到了结束条件。
  • 在一个复杂的数学计算库深层,发现由于第三方数据错误导致除数为 0。
  • 判断一个指针是否为 NULL 以决定是否分配内存。
  1. 运行以下程序,最终的输出是:
void f() { throw "Error"; }
int main() {
    try {
        f();
        cout << "Success ";
    } catch (const char* s) {
        cout << "Caught ";
    }
    cout << "Done";
    return 0;
}

{{ select(7) }}

  • Success Caught Done
  • 程序直接中止,因为 f() 内部没有 try-catch。
  • Caught Done
  • Success Done
  1. 关于 try 块变量作用域说法正确的是:

{{ select(8) }}

  • catch 块中定义的变量可以在 try 块中访问。
  • 如果在 try 块之前定义变量,则 trycatch 块都可以访问它。
  • try 块中定义的变量可以在随后的 catch 块中直接访问。
  • throw 抛出的变量名必须与 catch 接收的变量名一致。
  1. 如果代码中有 throw 10;,下列哪个 catch 块可以正确捕获它?

{{ select(9) }}

  • catch (double e)
  • catch (char e)
  • catch (int* e)
  • catch (int e)
  1. 防御性编程的核心目标是:

{{ select(10) }}

  • 使程序在发生非预期错误时能优雅地处理或安全地退出。
  • 通过增加 try-catch 块来提高程序的运行速度。
  • 减少代码量,使程序更短小。
  • 写出绝对不会出错的代码。