C++ 异常处理

一、异常处理到底是啥?

简单说,异常处理 就是 C++ 里专门用来 “捕获程序运行时意外错误” 的机制。比如程序要打开一个不存在的文件、数组下标越界、内存分配失败这些 “突发情况”,如果不处理,程序会直接崩溃;用异常处理,就能优雅地接住这些错误,让程序继续运行或友好退出。

可以类比成:你点外卖(程序执行),正常情况能收到餐(代码正常跑),但偶尔会遇到 “商家没货”“骑手超时”(异常)—— 异常处理就是让你不用干等着崩溃,而是能选择 “换一家店”“取消订单”(处理异常)。

二、核心语法(怎么用)

C++ 异常处理有 3 个核心关键字:trythrowcatch,三者配合使用,先看完整示例代码:

cpp

运行

#include <iostream> #include <stdexcept> // 包含标准异常类的头文件 using namespace std; // 一个可能抛出异常的函数:计算除法 double divide(double a, double b) { // 检测异常条件:除数为0 if (b == 0) { // 抛出异常:throw 后面是异常对象(可以是自定义值/标准异常) throw invalid_argument("除数不能为0!"); // 标准异常类,带错误信息 } return a / b; } int main() { double num1 = 10, num2 = 0; // 1. try块:包裹可能抛出异常的代码 try { double result = divide(num1, num2); cout << "计算结果:" << result << endl; } // 2. catch块:捕获并处理对应类型的异常 catch (const invalid_argument& e) { // 匹配throw抛出的异常类型 cout << "捕获到异常:" << e.what() << endl; // what()获取异常描述 } // 3. 万能catch:捕获所有类型的异常(可选) catch (...) { cout << "捕获到未知异常!" << endl; } // 异常处理后,程序继续执行 cout << "程序未崩溃,正常结束~" << endl; return 0; } 
代码运行结果:

plaintext

捕获到异常:除数不能为0! 程序未崩溃,正常结束~ 
关键语法解释:
  1. try:必须有,里面放 “可能出问题” 的代码(比如调用 divide 函数)。
  2. throw 抛出异常:当检测到错误时,用throw主动 “扔出” 一个异常(可以是 int、string、标准异常类等),程序会立刻跳转到对应的 catch 块,不再执行 throw 后面的代码。
  3. catch 捕获异常
    • 紧跟 try 块,catch(类型& e) 里的 “类型” 必须和 throw 抛出的类型匹配;
    • ... 是万能捕获,能接住所有类型的异常(建议最后加,防止漏捕导致程序崩溃);
    • e.what() 是标准异常类的成员函数,返回异常的描述字符串。

三、常用的标准异常类(不用自己造轮子)

C++ 标准库提供了一系列现成的异常类,直接用更规范,常见的有:

异常类用途示例场景
invalid_argument无效参数除数为 0、传入非法字符
out_of_range越界访问数组 / 字符串下标越界
bad_alloc内存分配失败new 关键字申请内存失败
runtime_error运行时错误(自定义描述)文件打开失败

示例:用out_of_range处理数组越界:

cpp

运行

#include <iostream> #include <stdexcept> #include <vector> using namespace std; int getElement(vector<int>& vec, int index) { if (index < 0 || index >= vec.size()) { throw out_of_range("数组下标越界!"); } return vec[index]; } int main() { vector<int> nums = {1,2,3}; try { cout << getElement(nums, 5) << endl; // 下标5越界 } catch (const out_of_range& e) { cout << "异常:" << e.what() << endl; } return 0; } 

四、为什么要用异常处理?

对比传统的 “返回错误码”(比如用 - 1 表示失败),异常处理的优势:

  1. 错误和业务逻辑分离:不用在代码里到处写if (返回值 == -1),错误处理集中在 catch 块,代码更整洁;
  2. 能跨函数传递:throw 抛出的异常可以穿过多层函数调用,直接被上层的 catch 捕获(比如函数 A 调用 B,B 调用 C,C 抛出异常,A 里的 catch 能接住);
  3. 强制处理错误:如果抛出异常但没被 catch,程序会调用terminate()直接崩溃,避免 “隐性错误”(比如返回错误码但程序员忘了判断)。

五、新手注意事项

  1. 不要用异常处理替代正常的逻辑判断(比如循环结束条件),只处理 “意外情况”;
  2. 抛出异常时尽量用标准异常类,而非 int/string,可读性和规范性更好;
  3. catch 块里尽量按 “具体异常在前,万能异常在后” 的顺序写,否则万能 catch 会先捕获,具体 catch 就失效了;
  4. 异常处理会有轻微的性能开销,但对普通程序几乎无影响,不用过度担心。

总结

  1. C++ 异常处理核心是try(包裹风险代码)+throw(抛出异常)+catch(捕获处理),能避免程序崩溃,优雅处理运行时错误;
  2. 优先使用标准异常类(如invalid_argumentout_of_range),让代码更规范;
  3. 异常处理适合处理 “意外错误”,而非正常逻辑判断,核心优势是错误与业务代码分离。

Read more

Copilot、Codeium 软件开发领域的代表性工具背后的技术

Copilot、Codeium 软件开发领域的代表性工具背后的技术

早期, Claude、Copilot、Codeium新兴的AI代码助手,模型的温度、切片的效果、检索方式、提示词的约束、AI 回复的约束、最终数据处理;整个环节,任何一个地方都可能造成最终效果不理想。 旨在通过代码生成、代码补全、代码解释和调试等多种功能,帮助开发者减少重复劳动,提高开发效率。尽管Codeium已经取得了显著的成果,但在处理复杂的代码任务、跨文件的修改以及支持定制化库和框架方面仍面临一定的局限性。 2020 年,OpenAI发布的GPT-3模型使AI生成代码的能力得以广泛应用,标志着AI代码助手的转型。2021年,GitHub 推出基于OpenAI Codex的 Copilot,提供实时代码补全和生成能力,提升开发效率,支持跨文件复杂任务。 其痛点,在大规模代码生成、跨文件任务处理以及定制化框架支持方面的局限性仍然限制了其在复杂项目中的应用。 2023年,Claude 3.5等新一代大型语言模型陆续出世,有效提升了自然语言理解与代码生成的能力。这类模型集成了代码生成、调试和文档自动生成等多项功能,能够帮助开发者快速编写高质量代码、优化程序性能并自动修复错误。随着

By Ne0inhk
【保姆级教程】llama.cpp大模型部署全攻略:CPU/GPU全兼容,小白也能轻松上手!

【保姆级教程】llama.cpp大模型部署全攻略:CPU/GPU全兼容,小白也能轻松上手!

一、简介 * • llama.cpp 是一个在 C/C++ 中实现大型语言模型(LLM)推理的工具 * • 支持跨平台部署,也支持使用 Docker 快速启动 * • 可以运行多种量化模型,对电脑要求不高,CPU/GPU设备均可流畅运行 * • 开源地址参考:https://github.com/ggml-org/llama.cpp • 核心工作流程参考: 二、安装与下载模型(Docker方式) 1. 搜索可用模型 • 这里以 qwen3-vl 模型为例,提供了多种量化版本,每种版本的大小不一样,根据自己的电脑性能做选择,如选择(模型+量化标签):Qwen/Qwen3-VL-8B-Instruct-GGUF:Q8_0 • 可以在huggingface官网中搜索可用的量化模型:https://huggingface.co/models?search=

By Ne0inhk

llama-cpp-python完整安装指南:5步解决90%新手问题 [特殊字符]

llama-cpp-python完整安装指南:5步解决90%新手问题 🎯 【免费下载链接】llama-cpp-pythonPython bindings for llama.cpp 项目地址: https://gitcode.com/gh_mirrors/ll/llama-cpp-python llama-cpp-python是专为llama.cpp库设计的Python绑定项目,为开发者提供了在Python环境中高效运行本地大语言模型的完美解决方案。通过该项目,您可以轻松实现文本生成、对话交互、多模态推理等AI功能,无需依赖云端API即可享受强大的本地AI推理能力。 🔧 一键编译配置技巧 环境配置是新手最容易遇到问题的环节。llama-cpp-python支持多种硬件加速后端,正确配置编译环境至关重要。 步骤1:基础环境检查 确保系统已安装Python 3.8+和C编译器: * Linux/Mac: gcc或clang * Windows: Visual Studio或MinGW * MacOS: Xcode命令行工具 步骤2:核心安装命令 pip in

By Ne0inhk
Llama 3-8B-Instruct 在昇腾 NPU 上的 SGLang 性能实测

Llama 3-8B-Instruct 在昇腾 NPU 上的 SGLang 性能实测

1.引言 随着大模型在各类智能应用中的广泛应用,高效的推理硬件成为关键瓶颈。昇腾 NPU(Ascend Neural Processing Unit)凭借其高算力、低能耗以及对 SGLang 的深度优化,能够显著提升大模型推理性能。本文以 Llama 3-8B-Instruct 为例,通过在昇腾 NPU 上的实测,展示其在吞吐量、延迟和资源利用方面的优势,并探索可行的优化策略,为开发者在今后的开发中提供可参考的案例。 在本篇文章中我们会使用到Gitcode的Notebook来进行实战,GitCode Notebook 提供了开箱即用的云端开发环境,支持 Python、SGLang 及昇腾 NPU 相关依赖,无需本地复杂环境配置即可直接运行代码和进行实验。对于没有硬件平台的小伙伴来说是非常便利的。 GitCode Notebook使用链接:https://gitcode.com/user/m0_49476241/notebook。 2.实验环境与准备 2.

By Ne0inhk