#498. 异常捕获练习
异常捕获练习
一、选择题
- 在 C++ 中,关于异常处理的描述,下列哪项是正确的?
{{ select(1) }}
throw关键字必须在try块内部直接使用,不能出现在函数调用中。- 异常处理机制的主要目的是取代所有的
if-else判断语句。 - 一旦执行了
throw语句,程序会立即跳转到匹配的catch块,try块中随后的代码将被跳过。 catch·` 块执行完毕后,程序会自动回到 throw 语句的下一行继续执行。
- 观察以下代码,输出结果是:
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
- 如果一个异常在抛出后,经过所有嵌套函数调用都没有找到匹配的 catch 块,程序最终会调用哪个函数?
{{ select(3) }}
- std::terminate()
- std::exit()
- std::abort()
- main()
- 关于“全捕获”语句 catch (...),下列说法错误的是:
{{ select(4) }}
- 在
catch (...)块内部,通常无法获取异常的具体数值或对象。 - 在一个
try块后,它可以出现在多个catch块的最前面。 - 它可以捕获任何类型的异常。
- 它常用于防御性编程,作为最后一道防线防止程序崩溃。
- 在跨函数捕获中,异常向上层传递时,原函数中已构造的局部变量会发生什么?
{{ select(5) }}
- 自动调用析构函数进行销毁(栈解旋)。
- 被强制转换为全局变量以便上层访问。
- 状态被冻结,等 catch 结束后恢复执行。
- 继续保留在内存中,直到程序结束。
- 下列哪种情况最适合使用异常处理机制而非简单的 if 判断?
{{ select(6) }}
- 检查用户输入的年龄是否为负数。
- 循环语句中判断是否达到了结束条件。
- 在一个复杂的数学计算库深层,发现由于第三方数据错误导致除数为 0。
- 判断一个指针是否为 NULL 以决定是否分配内存。
- 运行以下程序,最终的输出是:
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
- 关于 try 块变量作用域说法正确的是:
{{ select(8) }}
catch块中定义的变量可以在try块中访问。- 如果在
try块之前定义变量,则try和catch块都可以访问它。 - 在
try块中定义的变量可以在随后的catch块中直接访问。 throw抛出的变量名必须与catch接收的变量名一致。
- 如果代码中有 throw 10;,下列哪个 catch 块可以正确捕获它?
{{ select(9) }}
catch (double e)catch (char e)catch (int* e)catch (int e)
- 防御性编程的核心目标是:
{{ select(10) }}
- 使程序在发生非预期错误时能优雅地处理或安全地退出。
- 通过增加 try-catch 块来提高程序的运行速度。
- 减少代码量,使程序更短小。
- 写出绝对不会出错的代码。