在C++中,throw和catch是异常处理机制的关键字,它们共同工作以处理在程序执行过程中发生的异常情况。
throw 关键字
throw关键字用于抛出一个异常。当程序遇到无法处理的错误时,它会使用throw语句抛出一个异常。这通常是因为遇到了某些无法恢复的错误条件,如无效的输入、内存分配失败、文件打开失败等。
当你使用throw关键字时,你可以抛出一个值(通常是某种异常对象),这个值会被传递给最近的匹配的catch块。这个值可以是任何类型,但最好是某种异常类类型的对象,这样可以包含有关错误的更多信息。
示例:
cpp复制代码
| if (some_error_condition) {  | |
| throw std::runtime_error("An error occurred!");  | |
| } | 
在这个例子中,如果some_error_condition为真,程序将抛出一个std::runtime_error类型的异常,并传递一个字符串作为异常对象的描述。
catch 关键字
catch关键字用于捕获并处理由throw语句抛出的异常。catch块是放在try块之后的,用于处理try块中可能抛出的异常。
catch块可以指定它想要捕获的异常类型。当try块中的代码抛出异常时,C++运行时系统会查找与抛出的异常类型相匹配的catch块,并执行该块中的代码。
示例:
cpp复制代码
| try {  | |
| // Code that might throw an exception  | |
| if (some_error_condition) {  | |
| throw std::runtime_error("An error occurred!");  | |
| }  | |
| } catch (const std::runtime_error& e) {  | |
| // Handle the exception  | |
| std::cerr << "Caught an exception: " << e.what() << '\n';  | |
| } | 
在这个例子中,如果some_error_condition为真,程序将抛出一个std::runtime_error类型的异常。这个异常将被catch块捕获,并打印出异常对象的描述。
你也可以有多个catch块来处理不同类型的异常。每个catch块都会检查其参数类型是否与抛出的异常类型匹配。如果匹配,则执行该catch块中的代码。如果try块中的代码抛出了一个异常,但没有匹配的catch块,那么程序将调用std::terminate函数,这通常会终止程序的执行。
此外,还有一个特殊的catch块形式catch(...),它可以捕获所有类型的异常,通常用于执行一些清理操作,然后再重新抛出异常或记录错误。
异常处理是C++中处理错误的一种强大机制,它允许程序在发生错误时继续执行,而不是简单地崩溃。