在C++中,异常抛出通过throw
关键字实现,其核心作用是主动触发错误处理流程,并支持传递任意类型对象作为异常信息。结合try-catch
机制,它能将错误检测与处理分离,提升代码健壮性。关键亮点包括:throw
可抛出内置类型、标准库异常类或自定义对象;异常类型决定匹配的catch
块;未捕获的异常会导致程序终止。
-
throw
的语法与灵活性
使用throw 表达式;
抛出异常,表达式可以是字符串、整数或对象。例如,throw std::runtime_error("内存不足");
抛出标准异常类,携带错误描述。若省略表达式(如throw;
),则用于catch
块内重新抛出当前异常,便于多层处理。 -
与
try-catch
的协同机制
throw
抛出的异常会立即中断当前执行流,跳转到最近的匹配catch
块。匹配规则遵循类型严格性:catch(const T&)
可捕获T
及其派生类,而catch(...)
作为兜底处理所有异常。例如:cpp复制
try { throw 42; // 抛出整数 } catch (int e) { std::cerr << "捕获整数异常: " << e; } catch (...) { std::cerr << "未知异常"; }
-
标准异常与自定义扩展
推荐优先使用<stdexcept>
中的标准异常类(如std::logic_error
、std::out_of_range
),因其已集成错误信息接口(what()
方法)。自定义异常类需继承std::exception
,例如:cpp复制
class MyError : public std::exception { public: const char* what() const noexcept override { return "自定义错误"; } };
-
noexcept
与异常规范演进
C++11后,动态异常规范(如throw(int)
)被废弃,改用noexcept
声明函数是否可能抛出异常。例如void func() noexcept;
表示绝不抛异常,违反时直接终止程序。此举优化了性能并简化了代码维护。
提示:异常处理应避免滥用,仅针对不可恢复的错误。过度使用throw
可能导致性能损耗,而资源管理建议结合RAII(如智能指针)确保安全释放。