C++ 入门13:异常处理

初学者必备:C++经典入门详细教程 下面的是学C++时要注意的。  1.把C++当成一门新的语言学习(和C没啥关系!真的。);  2.看《Thinking In C++》,不要看《C++变成死相》;  3.看《The C++ Programming Language》和《Inside The C++ Object  Model》,不要因为他们很难而我们自己是初学者所以就不看;  4.不要被VC、BCB、BC、MC、TC等词汇所迷惑— 阅读详情

往期回顾:

C++ 入门10:继承和派生类-优快云博客

C++ 入门11:虚函数和多态-优快云博客

C++ 入门第12:模板(Template)-优快云博客


C++ 入门13:异常处理 

一、前言

在前面文章的学习中,我们学习了类和对象的基础知识、构造函数、拷贝构造函数、静态成员、常量成员、运算符重载、友元函数、友元类、继承和派生类、虚函数和多态以及模板。今天,我们将学习 C++ 中的异常处理。异常处理是 C++ 提供的一种处理程序运行时错误的机制,它使得程序可以优雅地处理错误,而不是简单地崩溃。是的,就是优雅的处理代码,通过异常处理机制,我们可以实现即使程序有不可执行的错误却依旧能正常运行。

二、异常处理

2.1、异常处理的重要性

异常处理的重要性在于它允许程序以一种结构化和可预测的方式处理错误,而不是简单地终止执行。这不仅提高了程序的健壮性和稳定性,还使得调试和维护变得更加容易。通过异常处理,开发者可以更加专注于业务逻辑的实现,而不必担心错误处理细节,因为异常处理机制会负责捕获和处理这些错误。

2.2、 什么是异常处理?

异常处理是编程中一种不可或缺的错误管理机制,它允许程序在运行时优雅地响应和处理错误或异常情况,从而避免程序因未处理的错误而突然崩溃。这种机制对于开发稳定、可靠和用户友好的软件至关重要。在C++中,异常处理通过一组特定的关键字和语法结构来实现,主要包括try、catch和throw,它们共同协作以捕获、传递和处理异常。

(1)try 块

try块是异常处理机制的核心,它标识了一段可能抛出异常的代码区域。当try块内的代码执行时,如果发生了异常情况(即抛出了一个异常),那么执行将立即停止,并跳转到紧随其后的catch块(如果有匹配的异常类型)进行异常处理。如果没有匹配的catch块,异常将按调用栈向上传播,直到找到相应的处理代码或最终由程序运行时环境捕获并处理(通常是终止程序)。

(2)catch 块

catch块紧随try块之后,用于捕获并处理try块中抛出的异常。catch块可以指定它想要捕获的异常类型,这允许程序对不同类型的异常采取不同的处理策略。如果有多个catch块,它们将按照在代码中出现的顺序进行匹配,一旦找到匹配的异常类型,就会执行该catch块中的代码,并忽略后续的catch块。如果try块中的代码没有抛出异常,那么catch块将被完全跳过。

(3)throw 表达式

throw关键字用于抛出一个异常。它后面可以跟任何类型的表达式,但通常是一个与错误或异常情况相关的对象。当throw语句执行时,它会立即停止当前函数的执行,并开始查找最近的try块。一旦找到,控制权就会转移到第一个匹配该异常类型的catch块。如果没有找到匹配的catch块,异常将继续向上传播,直到被捕获或程序终止。

2.3、 异常处理的基本语法

(1)异常处理的基本结构

try {
    // 可能抛出异常的代码
} catch (异常类型 变量名) {
    // 处理异常的代码
}

当 try 块中的代码抛出一个异常时,程序会立即跳转到 catch 块,并执行其中的代码。如果没有异常发生,catch 块的代码将不会被执行。

示例:

我们定义一个简单的示例,演示如何捕获和处理除零错误。

#include <iostream>
using namespace std;

int main() {
    int a = 10;
    int b = 0;
    int result;

    try {
        if (b == 0) {
            throw "Division by zero!";
        }
        result = a / b;
        cout << "Result: " << result << endl;
    } catch (const char* e) {
        cout << "Error: " << e << endl;
    }

    return 0;
}

在这个示例中,如果 b 为 0,则抛出一个字符串异常 "Division by zero!",并在 catch 块中捕获和处理这个异常。

2.4、 抛出和捕获不同类型的异常

C++允许抛出的异常几乎可以是任何类型的数据,包括基本数据类型(如int、float、char等)、用户定义的类对象、指针,甚至是函数指针和成员函数指针。然而,尽管技术上可行,但并非所有类型都适合用作异常类型。

(1)基本数据类型

虽然可以抛出基本数据类型的异常,但这种方式通常不推荐。原因之一是它们不提供足够的上下文或错误信息,使得捕获和处理这些异常时难以确定错误的具体原因。此外,对于基本数据类型,编译器无法提供类型安全的异常处理,因为多个不同类型的异常可能都会被同一个catch块捕获(除非使用多个catch块分别捕获每种类型,但这会降低代码的清晰度和可维护性)。

(2)类对象

相比之下,使用类对象作为异常类型更为常见和推荐。类对象可以封装更丰富的错误信息,包括错误代码、错误消息、发生错误的位置等。这种封装使得异常处理更加灵活和强大。

  1. 自定义异常类:开发者可以定义自己的异常类,这些类通常继承自标准库中的异常基类(如std::exception),从而继承一些基本的异常处理功能(如获取异常描述信息的what()方法)。通过定义自己的异常类,开发者可以添加额外的成员变量和方法,以支持更具体的错误信息和处理逻辑。

  2. 类型安全的异常处理:由于类对象具有明确的类型,因此可以使用C++的类型系统来确保异常处理的类型安全性。这意味着只有与catch块中指定的类型相匹配的异常才会被捕获,从而避免了错误的异常处理。

  3. 封装和继承:通过类的封装和继承特性,开发者可以构建异常处理的层次结构。基类异常可以代表一般性的错误,而派生类异常可以表示更具体的错误情况。这种结构使得异常处理更加模块化和可扩展。

  4. 易于调试和维护:由于类对象可以包含丰富的错误信息和上下文,因此它们对于调试和维护异常处理代码非常有用。当异常发生时,开发者可以轻松地获取到有关错误的所有相关信息,从而更快地定位问题并采取相应的修复措施。

示例:

我们自定义一个 DivideByZeroException 类,用于表示除零错误,并在代码中使用它。

#include <iostream>
#include <string>
using namespace std;

class DivideByZeroException {
private:
    string message;

public:
    DivideByZeroException(string msg) : message(msg) {}

    string getMessage() const {
        return message;
    }
};

int main() {
    int a = 10;
    int b = 0;
    int result;

    try {
        if (b == 0) {
            throw DivideByZeroException("Division by zero!");
        }
        result = a / b;
        cout << "Result: " << result << endl;
    } catch (DivideByZeroException& e) {
        cout << "Error: " << e.getMessage() << endl;
    }

    return 0;
}

在这个示例中,我们定义了一个 DivideByZeroException 类,并在除零错误发生时抛出该异常。catch 块捕获这个异常并输出错误信息。

2.5、多个 catch 块

在C++中,try块可以伴随多个catch块,这种设计允许我们的程序针对不同类型的异常进行精确的处理。每个catch块都关联着一个特定的异常类型(或类型派生自的基类),当try块中的代码抛出异常时,程序会按照catch块声明的顺序逐一检查它们,寻找能够处理该异常的第一个catch块。一旦找到匹配的catch块,就会执行该块中的代码,并忽略所有后续的catch块,即使它们也可能匹配相同的异常类型(由于C++的异常处理机制是基于第一个匹配的原则)。

多个 catch 块的机制使我们对异常处理可以更灵活性。我们可以根据需要,定义多个异常类,并为每种异常类型编写相应的处理逻辑。通过组合使用多个catch块,可以确保程序能够针对各种可能的错误情况做出恰当的响应。

注意:

虽然catch块可以有多个,但通常建议将它们组织得尽可能简洁明了,避免过于复杂的嵌套和重复的逻辑。此外,为了捕获所有未明确处理的异常,可以添加一个捕获...(省略号)的catch块作为最后的备选,这可以捕获所有类型的异常,但应谨慎使用,因为它可能会隐藏潜在的编程错误。

而且实际开发中不会使用太多的。

示例:

我们扩展前面的示例,添加一个 catch 块,用于捕获整数类型的异常。

#include <iostream>
#include <string>
using namespace std;

class DivideByZeroException {
private:
    string message;

public:
    DivideByZeroException(string msg) : message(msg) {}

    string getMessage() const {
        return message;
    }
};

int main() {
    int a = 10;
    int b = 0;
    int result;

    try {
        if (b == 0) {
            throw DivideByZeroException("Division by zero!");
        }
        result = a / b;
        cout << "Result: " << result << endl;
    } catch (DivideByZeroException& e) {
        cout << "Error: " << e.getMessage() << endl;
    } catch (int e) {
        cout << "Integer error: " << e << endl;
    }

    return 0;
}

在这个示例中,如果抛出 DivideByZeroException 类型的异常,将会被第一个 catch 块捕获。如果抛出整数类型的异常,将会被第二个 catch 块捕获。 

2.6、异常的再抛出

在某些情况下,catch块中的代码可能无法完全处理当前捕获的异常,或者它可能认为该异常应该由更高层的代码来处理。在这种情况下,catch块可以使用throw关键字重新抛出异常。重新抛出的异常可以被更外层的try-catch结构捕获并处理。

(1)两种方式:

不带表达式的throw:

简单地使用throw;语句(注意末尾的分号)可以重新抛出当前捕获的异常。这种方式保留了异常的原始类型和值,以及任何与之关联的堆栈跟踪信息(如果编译器和运行时环境支持的话)。
带表达式的throw:虽然不太常见,但也可以使用throw后跟一个表达式来重新抛出一个新的异常。这通常用于在捕获并处理了一个异常后,基于该异常的信息构造并抛出一个新的异常。

重新抛出异常是一种重要的异常处理策略,它允许我们在异常处理链中传递异常,直到找到能够妥善处理该异常的代码为止。这种机制允许我们将异常处理的责任委托给更高层的代码,而不必在每个可能抛出异常的点都编写完整的错误处理逻辑。

注意:

同样的,过度使用异常再抛出可能会导致异常处理逻辑的复杂化,特别是在涉及多层嵌套try-catch结构的情况下。很多时候其实我们是需要确保异常处理逻辑清晰、简洁且易于理解的。所以大家谨慎使用。

示例:

我们演示如何在 catch 块中重新抛出异常。

#include <iostream>
#include <string>
using namespace std;

class DivideByZeroException {
private:
    string message;

public:
    DivideByZeroException(string msg) : message(msg) {}

    string getMessage() const {
        return message;
    }
};

void divide(int a, int b) {
    try {
        if (b == 0) {
            throw DivideByZeroException("Division by zero!");
        }
        int result = a / b;
        cout << "Result: " << result << endl;
    } catch (DivideByZeroException& e) {
        cout << "Caught in divide function: " << e.getMessage() << endl;
        throw; // 重新抛出异常
    }
}

int main() {
    int a = 10;
    int b = 0;

    try {
        divide(a, b);
    } catch (DivideByZeroException& e) {
        cout << "Caught in main function: " << e.getMessage() << endl;
    }

    return 0;
}

在这个示例中,当 divide 函数中的异常被捕获后,异常被重新抛出,并在 main 函数中再次被捕获和处理。


以上就是 C++ 程序的异常处理的基础知识点了。包括异常处理的基本语法、抛出和捕获不同类型的异常、多个 catch 块以及异常的再抛出。异常处理是 C++ 中的一种非常重要的机制,基本上在开发中都会用到的,大家多看看,一定要掌握。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

13、C++面向程序设计:C++命名空间和异常处理 C++面向对象程序设计;C++命名空间;C++异常处理 阅读详情

相关推荐

掌握c++异常处理:你需要知道的一切

本文详细介绍了C++异常处理的基本语法,包括如何使用try、catch和throw关键字来捕获和处理异常。我们阐述了异常处理的基本指导原则,包括避免在构造函数和析构函数中抛出异常,以及捕获异常的最佳实践。此外,我们深入讨论了Exception类,以及如何通过继承和重写来创建自定义的异常类。我们还进行了标准异常的扩展,包括如何在自定义异常类中使用标准异常进行异常传递。最后,我们介绍了std::exception_ptr,讨论了如何使用它来处理异常的指针,以及在多线程环境下的异常处理方法。

Lion_Long的博客 1152

c语言异常处理机制的意义,C++的异常处理机制

一、什么是异常处理一句话:异常处理就是处理程序中的错误。二、为什么需要异常处理,以及异常处理的基本思想C++之父Bjarne Stroustrup在《The C++ Programming Language》中讲到:一个库的作者可以检测出发生了运行时错误,但一般不知道怎样去处理它们(因为和用户具体的应用有关);另一方面,库的用户知道怎样处理这些错误,但却无法检查它们何时发生(如果能检测,就可以再用...

weixin_30131443的博客 829

13 异常处理的使用大全

异常是指程序在执行的过程中,没有按照预定的流程和逻辑去运行,从而导致数组越界、内存溢出、甚至程序崩溃等各种非正常的情况。在C++、Java和C#等高级语言中,都提供了对于异常的处理机制。异常处理,实际上是一种转移程序控制权的方式。当程序中抛出了异常时,我们可以捕获异常,进而进行相应的处理。处理模型一般有两种:一种是终止模型,表示该异常是致命的,无法恢复,会直接终止程序;另一种是恢复模型,表示该异常是临时的,可恢复的,会尝试去修正错误,确保程序可以继续运行。

hope_wisdom的技术博客 1192

C++里为什么要用异常处理try和catch

本文介绍初学者对异处理的误解,C++异常语句的用法,以及编程中为什么要用异常处理语句。一、初学者对异常处理的误解       网络上的很多文章对异常处理的开篇解释大概是这样的:人们设计出来的程序,做不到天衣无缝,在运行时总会出现各种意想不到的异常。因此,希望程序不仅能在正确的情况下正常运行,而且在程序有错误的情况下也能作出相应的处理,而不致使程序莫名其妙的终止崩溃,甚至出现死机的现象。比如做除法时...

Dengdew的博客 4774

13、掌握C++异常处理:构建健壮的应用程序

本文深入探讨了C++中的异常处理机制,包括基本概念、使用方法、RAII资源管理、异常安全设计以及最佳实践。通过实际代码示例和性能测试,帮助开发者掌握如何构建健壮的应用程序,提高程序的可靠性和效率。

yoga7的博客 517

Windows(Win10、Win11)本地部署开源大模型保姆级教程

最近开源大模型可谓闹的沸沸扬扬,尤其是Microsoft开源的和Meta开源的llama3 70b,评测都已经接近了的水平。鉴于还有很多同学不会在上部署和使用本地模型,因此我们出一期保姆级教程。本文讲述了如何在上本地部署大模型。从最基础的软件安装到环境配置都进行了截图展示,希望对非计算机的同学也有所帮助。AI时代我们每个人都必须要掌握一些AI知识,相信不断学习的你一定不会被AI淘汰。这只是开始,后面我们还有很多工作要做,尤其是提示词和智能体。

AIGIS的博客 3万+

c++异常处理的作用

一般来说比较大的程序,对待错误处理有两种模式: 1. 返回错误码,基本上所有的程序都返回一个错误码(一般用int),来标识函数是否执行正确;然后函数调用者都要判断一下返回值是不是0(一般成功执行的标识)。理论上所有的函数调用都必须要判断一下这个返回值。所以,你懂得,程序里面就会有一堆的if…else… ,每个错误分支打印一条日志,再向上层返回错误码。 很麻烦,但是很多大公司的老项目(或者公司的老人...

大东 2461

MTK6769平台Type-C充电全解析:从硬件管脚到PD协议实战(Android15环境)

本文深入解析了MTK6769平台在Android 15环境下Type-C充电的完整链路。从硬件管脚(特别是核心的CC引脚)功能与连接,到USB-PD协议报文抓取与实战分析,并结合MTK平台PD芯片驱动与充电IC驱动的软件框架,提供了从硬件设计到软件调试的系统性解决方案和常见问题排查案例。

ol78901234的博客 311

C++异常处理机制的作用(个人理解)

之前一直没有对异常处理机制有个好的认知,总感觉这个东西有些鸡肋。 但最近在写C++/MFC/Halcon开发的程序的时候突然感觉领会了一些异常处理机制的作用,现记录下来。 Halcon算法有时会碰到这种问题,台式机没有连接摄像设备,但是Halcon写的算法需要进行图像处理,没有图像怎么办呢?报错就完了,可是Halcon报错不是一般的报错,只要Halcon函数使用出现错误,直接就挂掉程序,就像下面这...

o707191418的博客 1754

UE5游戏逆向实战:用FModel提取.pak文件中的3D模型(附Dumper-7避坑指南)

本文详细介绍了如何使用FModel工具从UE5游戏的.pak文件中提取3D模型,并提供了Dumper-7的避坑指南。内容涵盖FModel工具链配置、UE5特有的unversioned properties问题解决方案、Dumper-7实战流程以及模型后处理技巧,帮助开发者高效获取游戏资产。

weixin_30872499的博客 422

PCF8591实战指南:从IIC通信到STM32的ADC/DAC配置(附完整代码)

本文详细介绍了PCF8591芯片在STM32开发中的实战应用,涵盖IIC通信协议、ADC/DAC配置及完整代码实现。通过解析DATA SHEET关键参数,提供硬件连接指南、控制字节配置技巧和常见问题解决方案,帮助开发者快速掌握这款8位模数/数模转换器的使用,实现精确的模拟信号处理。

y7z8a的博客 539

Java中异常机制的意义

什么是异常:异常就是程序在运行时出现的不正常情况。对于严重的情况Java通过Error类进行描述,一般不用编写代码处理;对于不严重的情况Java通过Exception描述,一般编写针对性代码对其进行处理。 异常由来:问题也是生活中一个具体的事物,也可以通过Java类的形式进行描述(比如进行运算时被除数不可以为0否则出现ArithmeticException异常,数组越界会出现ArrayIndex

Java语言学习日志 5961

计算机视觉学习路线图:从入门到专家

计算机视觉学习路线图:从入门到专家​ ,人工智能,计算机视觉,大模型,AI,计算机视觉学习路线图从七方面展开。先强调数学基础,含线性代数、概率统计和微积分;接着介绍 Python、OpenCV 等编程语言与工具;涵盖边缘检测、特征提取等经典算法;阐述深度学习中 CNN 结构、经典模型及实现;涉及目标检测、图像分割等高级专题;包含图像分类、目标检测和人脸识别等项目实战;最后提及科研进阶的论文阅读、项目参与和论文发表,助学习者从入门到专家。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 7万+

【C++】零基础入门 · 第 13 节:异常处理(try、catch、throw)

当标准异常类不能满足需求时,你可以定义自己的异常类。通常的做法是继承private:public:throw MyException("自定义异常:操作失败!");自定义异常:操作失败!自定义异常的好处是你可以携带更多的上下文信息(比如错误代码、发生位置等),方便调试和日志记录。try包裹可能出错的代码,throw抛出异常,catch捕获并处理。标准异常类(等)提供了统一的错误描述接口。异常沿着调用链自动向上传递,直到被catch捕获。

2601_95983126的博客 264

AI上推荐 之 隐语义模型(LFM)和矩阵分解(MF)

1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产者:如何让自己生产的信息脱颖而出, 受到广大用户的关注? 为了解决这个矛盾, 推荐系统应时而生, 并飞速前进,在用户和信息之间架起了一道桥梁,一方面帮助用户发现对自己有价值的信息, 一方面让信息能够展现在对它感兴趣的用户前面。 推荐系统近几年有了深度学习的助推发展之势迅猛, 从前深度学习的传统推荐模型(协

Miracle8070 1万+

AgentScope 2.0 源码解析-工具系统解读:从内置工具到权限管控的完整实践

本文深入解析AgentScope 2.0工具系统的完整架构,覆盖内置工具集(文件读写、命令执行、搜索匹配)、MCP协议集成(STDIO/HTTP双传输、客户端封装、工作空间网关)、工具包管理与动态分组、权限引擎的多级决策机制(危险路径保护、只读识别、模式控制),以及自定义工具开发流程。通过分层架构图和时序图直观展示组件协作关系,结合安全最佳实践与故障排除指南,为开发者提供从工具使用到安全管控的全链路参考。

program哲学 569

C++ 异常处理:从入门到精通的 20 个实战技巧

想象一下,你正在驾驶一辆满载乘客的大巴车,突然遇到前方道路塌陷。如果没有刹车系统,大巴会直接冲进坑里;如果有刹车系统但没有安全带,乘客会在急刹车时受伤。C++ 异常处理机制就像是程序世界的 "刹车 + 安全带" 组合,让你在遇到意外时能够安全停车并保护资源。 在 C++ 中,异常处理是一把双刃剑:用得好可以写出健壮的代码,用得不好会导致程序崩溃或性能下降。本文将通过 20 个实战案例,带你从基础到高级全面掌握 C++ 异常处理的核心技术,包括: 异常处理的底层原理 自定义异常体系设计 多线程环境下的异常

陈大大陈的博客 1685

C# Blazor Server工业监控Web UI:实时数据推送、历史曲线、报警记录,跨浏览器访问(踩坑总结+生产可用)

坑点现象解决方案StateHasChanged()太频繁服务器CPU占用高,浏览器卡顿别100ms刷新一次,1秒刷新一次足够并发高时服务器卡多个用户同时访问,服务器响应慢用Redis做分布式缓存,或者加服务器做负载均衡断线重连后数据丢失浏览器刷新后,实时数据不更新用InfluxDB存历史数据,刷新后重新查询工业现场网络不稳定Blazor Server频繁断线用SQLite本地缓存,断网时数据不丢,联网后补发历史曲线查询慢查询过去7天的数据,要等很久。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 305

13、C++异常处理

对于第二种情况,异常正处于激活状态,而析构函数又抛出了异常这时C++将通过std::terminate()函数,令进程中止。根据异常对象的类型自上至下顺序匹配,而非最优匹配,因此对子类类型异常的捕获不要放在对基类类型异常的捕获后面。如果函数抛出了异常说明以外的异常类型,那么该异常将无法被捕获并导致进程中止。异常说明是函数原型的一部分,旨在说明函数可能抛出的异常类型。异常说明是一种承诺,承诺函数不会抛出异常说明以外的异常类型。隐式抛出异常的函数也可以列出它的异常说明。异常说明可以没有也可以为空。

Salted fish in hand, I have the world. 1051

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【C++入门精讲13】异常处理

本文全面解析C++异常处理机制,涵盖基础语法、自定义异常类和noexcept关键字。主要内容包括:1)异常处理基础,对比C语言错误处理方式,介绍try-catch-throw核心语法;2)自定义异常类设计要点,包括继承系统异常类、虚函数使用和多态处理;3)noexcept关键字的作用及适用场景;4)异常处理注意事项,如异常栈解旋、引用捕获和捕获顺序等。文章通过大量代码示例演示异常处理的实际应用,帮助开发者编写更健壮的C++程序。

2501_90355051的博客 299

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【C++】异常处理:深度解析与实战精髓,不容错过的编程秘籍

详细讲解了c++异常处理的方方面面,从概念到使用以及c++异常的优缺点

You build it, you run it 2888

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

13C++异常处理

异常处理 14.1.1 异常处理的任务 程序编制者不仅要考虑程序没有错误的理想情况,更要考虑程序存在错误时的情况,应该能够尽快地发现错误,消除错误。 程序中常见的错误有两大类: 语法错误和运行错误。在编译时,编译系统能发现程序中的语法错误。 有的程序虽然能通过编译,也能投入运行。但是在运行过程中会出现异常,得不到正确的运行结果,甚至导致程序不正常终止,或出现死机现象。这类错误比较隐蔽,...

weixin_30477293的博客 244

Cpp-TaskFlow 3.7.0 版本发布:性能优化与异常处理增强

Cpp-TaskFlow 3.7.0 版本发布:性能优化与异常处理增强 【免费下载链接】taskflow 项目地址: https://gitcode.com/gh_mirrors/taskfl/taskflow ...

gitblog_01146的博客 412

C++之异常处理

为什么引入异常 在C语言中错误的处理,通常采用返回值的方式或是使用全局变量的方式。这就存在两个问题,一是如果返回值正是我们需要的数据,这就导致了返回数据同出错数据容错差不高。 二是全局变量,在多线程中易引发竞争,而且,当错误发生时,上级函数要出错处理,层层上报,造成过多的出错处理代码,且传递的效率低下。 因此C++引入了面向对象级别的异常处理机制。 在C++中异常的处理和具体逻辑的处理不比在同一个函数中,这样就可以做到底层逻辑专注于功能的实现,具体错误处理交由上层业务逻辑去处理。 异常如何使用? 使用关键字

u012944685的专栏 3423

2023-5-22-C++异常处理机制学习

C++ 异常处理机制是一种用于在程序运行时检测错误并进行相应处理的技术。当程序执行过程中遇到异常情况,比如计算错误、内存分配失败等,就会抛出一个异常对象。该对象包含有关异常的信息,包括异常类型和位置。 异常处理机制是由 try-catch 块组成的。try 块中包含可能引发异常的代码,而 catch 块则用于处理特定类型的异常。可以为每个 try 块指定多个 catch 块,以便处理不同类型的异常。 当 try 块中的代码引发异常时,控制流将转移到与之匹配的 catch 块。如果没有匹配的 catch

小tom的博客 1339

C++基础14:异常处理

此专栏为移动机器人知识体系的C++基础,用于C++入门。

FUXI_Willard 845
上一篇: C++ 入门12:模板(Template)
下一篇: C++ 入门14:STL 容器之向量(vector)
从一的
博客等级 码龄5年 1995粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值