当前位置: 首页 > news >正文

C++之异常

目录

一、异常的概念及使用

1.1、异常的概念

1.2、异常的抛出和捕获

1.3、栈展开

1.4、查找匹配的处理代码

1.5、异常重新抛出

1.6、异常安全问题

1.7、异常规范

1.8、C++异常的优缺点

二、标准库的异常


一、异常的概念及使用

1.1、异常的概念

  • 异常处理机制允许程序中独⽴开发的部分能够在运⾏时对于出现的问题进⾏通信并做出相应的处理, 异常使得我们能够将问题的检测与解决问题的过程分开,程序的⼀部分负责检测问题的出现,然后解决问题的任务传递给程序的另⼀部分,检测环节⽆须知道问题的处理模块的所有细节。
  • C语⾔主要通过错误码的形式处理错误,错误码本质就是对错误信息进⾏分类编号,拿到错误码以后还要去查询错误信息,⽐较麻烦。C++中,通过throw抛出一个异常对象,该对象可以携带错误信息(如错误描述,错误码等),用于在异常处理流程中传递详细的错误上下文。

C语言异常示例:

1.2、异常的抛出和捕获

异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接调用者处理这个错误。

  • throw:当问题出现时,程序会抛出一个异常。这是通过使用throw关键字来完成的。
  • catch:在想要处理问题的地方,通过异常处理程序捕获异常,catch关键字用来捕获异常,可以有多个catch进行捕获。
  • try:try块中的代码可能会抛出异常,其后通常跟着一个或者多个catch块用于捕获并处理这些异常。

异常的抛出和匹配原则:

  • 异常是通过抛出对象而引发的,该对象的类型决定了应该激活哪个catch的处理代码。
  • 被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那一个。
  • 抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,所以会生成一个拷贝对象,这个拷贝的临时对象会在被catch以后销毁。(这里的处理类似于函数的传值返回)
  • catch(...)可以捕获任意类型的异常,问题是不知道异常的错误是什么。
  • 异常的匹配执行的是严格匹配,不会进行隐式类型转换,例如抛出int类型的异常,用size_t类型接收该异常会因为类型不匹配而接收不到这个异常,但是实际中抛出和捕获的匹配原则有个例外,并不都是类型完全匹配,可以抛出派生类对象,使用基类捕获,这个在实际中非常实用。
  • 当throw执⾏时,throw后⾯的语句将不再被执⾏。程序的执⾏从throw位置跳到与之匹配的catch 模块,catch可能是同⼀函数中的⼀个局部的catch,也可能是调⽤链中另⼀个函数中的catch,控制权从throw位置转移到了catch位置。这⾥还有两个重要的含义:1、沿着调⽤链的函数可能提早退出。2、⼀旦程序开始执⾏异常处理程序,沿着调⽤链创建的对象都将销毁。

示例代码一:

double Division(int a, int b)
{// 当b == 0时抛出异常if (b == 0){//可以抛任意类型异常throw "Division by zero condition!";}else{return ((double)a / (double)b);}
}void Func()
{int len, time;cin >> len >> time;try{cout << Division(len, time) << endl;}catch (size_t x) {cout << x << endl;}catch (const char* errmsg){cout << errmsg << endl;}cout << "xxxxxxxxxxxxxxxxxxxxx" << endl;
}int main()
{try{Func();}catch (const char* errmsg){cout << errmsg << endl;}catch (...){cout << "unkown exception" << endl;}return 0;
}

结果:

解释:上面代码在Division函数中抛出一个异常,类型是字符串(char*),⾸先检查throw本⾝是否在try块内部,这里检查发现没有,继续向上层调用的函数(Func)查找,上层中调用Division时被try块包裹,查找对应的catch,如果找到执行,如果没有继续向上层查找,这里找到了,所以直接执行catch中的代码,且因为异常跳转到该函数,执行完catch块中的代码后,该函数中catch块下面的代码也会执行,调用Func的上层函数main函数也有匹配的catch代码块,但是没有Func中的近(一级一级向上查找,先遇到哪个合适就执行哪个),所以main函数中的catch块没有执行。异常一旦被某一个catch代码块捕获,就不会再去找其他的catch代码块了。

示例代码二:

double Division(int a, int b)
{// 当b == 0时抛出异常if (b == 0){string s("Division by zero condition!");throw s;}else{return ((double)a / (double)b);}
}void Func()
{int len, time;cin >> len >> time;try{cout << Division(len, time) << endl;}catch (size_t x){cout << x << endl;}catch (const char* errmsg){cout << errmsg << endl;}cout << "xxxxxxxxxxxxxxxxxxxxx" << endl;
}int main()
{try{Func();}catch (const char* errmsg){cout << errmsg << endl;}return 0;
}

结果:

解释:上面代码中Division抛出了一个异常,但是一直找到main函数都没有符合的catch代码块,所以程序结束并报错。

示例代码三:

int main()
{while (1){try{Func();}catch (const string& errmsg){cout << errmsg << endl;}catch (...){cout << "unkown exception" << endl;}}return 0;
}

解释:为了防止因为一些没有对应catch代码块的异常导致的程序崩溃,可以在最后通过catch(...)来接收任意类型的异常。

示例代码四:

// 服务器开发中通常使用的异常继承体系
class Exception
{
public:Exception(const string& errmsg, int id):_errmsg(errmsg), _id(id){}virtual string what() const{return _errmsg;}int getid() const{return _id;}protected:string _errmsg;int _id;
};class SqlException : public Exception
{
public:SqlException(const string& errmsg, int id, const string& sql):Exception(errmsg, id), _sql(sql){}virtual string what() const{string str = "SqlException:";str += _errmsg;str += "->";str += _sql;return str;}
private:const string _sql;
};class CacheException : public Exception
{
public:CacheException(const string& errmsg, int id):Exception(errmsg, id){}virtual string what() const{string str = "CacheException:";str += _errmsg;return str;}
};class HttpServerException : public Exception
{
public:HttpServerException(const string& errmsg, int id, const string& type):Exception(errmsg, id), _type(type){}virtual string what() const{string str = "HttpServerException:";str += _type;str += ":";str += _errmsg;return str;}private:const string _type;
};void SQLMgr()
{if (rand() % 7 == 0){throw SqlException("权限不足", 100, "select * from name = '张三'");}cout << "调用成功" << endl;
}void CacheMgr()
{if (rand() % 5 == 0){throw CacheException("权限不足", 100);}else if (rand() % 6 == 0){throw CacheException("数据不存在", 101);}SQLMgr();
}void seedmsg(const string& s)
{//cout << "void seedmsg(const string& s)" << endl;//throw HttpServerException("网络不稳定,发送失败", 102, "put");if (rand() % 2 == 0){throw HttpServerException("网络不稳定,发送失败", 102, "put");}else if (rand() % 3 == 0){throw HttpServerException("你已经不是对象的好友,发送失败", 103, "put");}else{cout << "发送成功" << endl;}
}void HttpServer()
{/*if (rand() % 3 == 0){throw HttpServerException("请求资源不存在", 100, "get");}else if (rand() % 4 == 0){throw HttpServerException("权限不足", 101, "post");}*/// 失败以后,再重试3次for (size_t i = 0; i < 4; i++){try{seedmsg("今天一起看电影吧");break;}catch (const Exception& e){if (e.getid() == 102){if (i == 3)throw e;cout << "开始第" << i + 1 << "重试" << endl;}else{throw e;}}}//CacheMgr();
}int main()
{srand(time(0));while (1){this_thread::sleep_for(chrono::seconds(1));try {HttpServer();}catch (const Exception& e) // 这里捕获父类对象就可以{using std::chrono::system_clock;// 多态system_clock::time_point today = system_clock::now();std::time_t tt = system_clock::to_time_t(today);cout << ctime(&tt) << e.what() << endl << endl;}catch (...){cout << "Unkown Exception" << endl;}}return 0;
}

解释:实际场景中,通常会定义一个异常的基类,然后对应不同的情况创建不同的子类并继承基类,这样抛出异常时可以根据需要抛出不同的异常,并使用基类来统一接收。

注意:异常可以抛任意类型,异常必须在try-catch语句中被捕获,如果一个异常被抛出,但没在try-catch语句中被捕获,程序将会报错。

1.3、栈展开

在函数调用链中异常栈展开匹配原则:

  • 抛出异常后,程序暂停当前函数的执⾏,开始寻找与之匹配的catch⼦句,⾸先检查throw本⾝是否在try块内部,如果在则查找匹配的catch语句,如果有匹配的,则跳到catch的地⽅进⾏处理。
  • 如果当前函数中没有try/catch⼦句,或者有try/catch⼦句但是类型不匹配,则退出当前函数,继续在外层调⽤函数链中查找,上述查找的catch过程被称为栈展开。
  • 如果到达main函数,依旧没有找到匹配的catch⼦句,程序会调⽤标准库的 terminate 函数终⽌程序。所以实际中我们最后都要加一个catch(...)捕获任意类型的异常,否则当有异常没捕获,程序就会直接终止。
  • 如果找到匹配的catch⼦句处理后,catch⼦句代码会继续执⾏。

1.4、查找匹配的处理代码

  • ⼀般情况下抛出对象和catch是类型完全匹配的,如果有多个类型匹配的,就选择离他位置更近的那个。
  • 但是也有⼀些例外,允许从⾮常量向常量的类型转换,也就是权限缩小;允许数组转换成指向数组元素类型的指针,函数被转换成指向函数的指针;允许从派⽣类向基类类型的转换,这个点⾮常实⽤,实际中继承体系基本都是⽤这个⽅式设计的。
  • 如果到main函数,异常仍旧没有被匹配就会终⽌程序,不是发⽣严重错误的情况下,我们是不期望程序终⽌的,所以⼀般main函数中最后都会使⽤catch(...),它可以捕获任意类型的异常,但是是不知道异常错误是什么。

1.5、异常重新抛出

有时catch到⼀个异常对象后,需要对错误进⾏分类,其中的某种异常错误需要进⾏特殊的处理,其他错误则重新抛出异常给外层调⽤链处理。捕获异常后需要重新抛出,直接 throw; 就可以把捕获的对象直接抛出。

示例代码:

double Division(int a, int b)
{// 当b == 0时抛出异常if (b == 0){throw "Division by zero condition!";}return (double)a / (double)b;
}void Func()
{// 这里捕获异常后并不处理异常,异常还是交给外面处理,这里捕获了再// 重新抛出去。try {int len, time;cin >> len >> time;cout << Division(len, time) << endl;}catch (...){cout << "继续向上抛出异常" << endl;throw; // 异常重新抛出,捕获到什么抛出什么}// ...}

1.6、异常安全问题

  • 异常抛出后,后⾯的代码就不再执⾏,前⾯申请了资源(内存、锁等),后⾯进⾏释放,但是中间可能会抛异常就会导致资源没有释放,这⾥由于异常就引发了资源泄漏,产⽣安全性的问题。中间我们需要捕获异常,释放资源后⾯再重新抛出,当然后⾯智能指针章节讲的RAII⽅式解决这种问题是更好的。
  • 构造函数完成对象的构造和初始化,最好不要在构造函数中抛出异常,否则可能导致对象不完整或没有完全初始化。
  • 其次析构函数中,如果抛出异常也要谨慎处理,⽐如析构函数要释放10个资源,释放到第5个时抛出异常,则也需要捕获处理,否则后⾯的5个资源就没释放,也资源泄漏了。《Effctive C++》第8个条款也专⻔讲了这个问题,别让异常逃离析构函数。

1.7、异常规范

  • 对于用户和编译器而言,预先知道某个程序会不会抛出异常⼤有裨益,知道某个函数是否会抛出异常有助于简化调⽤函数的代码。
  • C++98中函数参数列表的后⾯接throw(),表⽰函数不抛异常,函数参数列表的后⾯接throw(类型1, 类型2...)表⽰可能会抛出多种类型的异常,可能会抛出的类型⽤逗号分割。
  • C++98的⽅式这种⽅式过于复杂,实践中并不好⽤,C++11中进⾏了简化,函数参数列表后⾯加 noexcept表⽰不会抛出异常,啥都不加表⽰可能会抛出异常。
  • 编译器并不会在编译时检查noexcept,也就是说如果⼀个函数⽤noexcept修饰了,但是同时⼜包含了throw语句或者调⽤的函数可能会抛出异常,编译器还是会顺利编译通过的(有些编译器可能会报个警告)。但是⼀个声明了noexcept的函数抛出了异常,程序会调⽤ terminate 终⽌程序。
  • noexcept(expression)还可以作为⼀个运算符去检测⼀个表达式是否会抛出异常,可能会则返回 false,不会就返回true。

1.8、C++异常的优缺点

C++异常的优点:

  1. 异常对象定义好了,相比错误码的方式可以清晰准确的展示出错误的各种信息,甚至可以包含堆栈调用的信息,这样可以帮助我们更好的定位程序的bug。返回错误码的传统方式有个很大的问题就是,在函数调用链中,深层的函数返回了错误,那么我们得层层返回错误,最外层才能拿到错误。
  2. 很多第三方库都包含异常,比如boost,gtest,gmock等等常用的库,那么我们使用它们也需要使用异常。
  3. 部分函数使用异常更好处理,比如T& operator这样的函数,如果访问越界了只能使用异常或者终止程序处理,没办法通过返回值表示错误。

T& operator[](int i)

{

        if(i >= _size)

                throw out_of_range("越界");

        return _a[i];

}

C++异常的缺点:

  1. 异常会导致程序的执行流乱跳,并且非常的混乱,并且是运行时出错抛异常就会乱跳。这会导致我们跟踪调试时以及分析程序时,比较困难。
  2. 异常会有一些性能的开销,不过在现代硬件速度很快的情况下,这个影响基本忽略不计。
  3. C++没有垃圾回收机制,资源需要自己管理。有了一场非常容易造成内存泄漏,死锁等异常安全问题。这个需要使用RAII来处理资源的管理问题。
  4. C++标准库的异常体系定义的不好,导致大家各自定义各自的异常体系,非常的混乱。
  5. 异常尽量规范使用,否则后果不堪设想,随意抛异常,外层捕获的用户苦不堪言,所有异常规范有两点:一、抛出异常的类型都继承自一个基类。二、函数是否抛异常,抛什么异常,都使用func() throw();或noexcept的方式规范化。

二、标准库的异常

官网:exception - C++ Reference

C++标准库也定义了⼀套⾃⼰的⼀套异常继承体系库,基类是exception,所以我们⽇常写程序,需要在主函数捕获exception即可,要获取异常信息,调⽤what函数,what是⼀个虚函数,派⽣类可以重写。

相关文章:

C++之异常

目录 一、异常的概念及使用 1.1、异常的概念 1.2、异常的抛出和捕获 1.3、栈展开 1.4、查找匹配的处理代码 1.5、异常重新抛出 1.6、异常安全问题 1.7、异常规范 1.8、C异常的优缺点 二、标准库的异常 一、异常的概念及使用 1.1、异常的概念 异常处理机制允许程序中…...

服务器不能复制粘贴文件的处理方式

1.打开远程的服务器,在服务器的任务栏随便一块空白处右击鼠标,选择“启动任务管理器”。 2.在打开的任务管理器中,我们找到“rdpclip.exe”这个进程,如果没有找到那么如图所示 任务管理器–文件–运行新任务&#xff0c;然后在弹出的对话框内输入rdpclip.exe 如下图&#xff1…...

Golang | 搜索表达式

// (( A | B | C ) & D ) | E & (( F | G ) & H )import "strings"// 实例化一个搜索表达式 func NewTermQuery(field, keyword string) *TermQuery {return &TermQuery{Keyword: &Keyword{Field: field, Word: keyword},} }func (tq *TermQuery…...

【速写】conda安装(linux)

序言 昨天叶凯浩空降&#xff08;全马241&#xff09;&#xff0c;降维打击&#xff0c;10分24秒断层夺冠。 夏潇阳10分53秒绝杀小崔10分54秒第2&#xff0c;小崔第3&#xff0c;均配都在3’30"以内&#xff0c;即便我是去年巅峰期也很难跑出这种水平。我就知道他去年大…...

linux两个特殊的宏 _RET_IP_ 和_THIS_IP_ 实现

本文探讨了Linux环境下两个特殊的宏,_RET_IP_和_THIS_IP_,它们分别用于获取当前函数的返回地址和当前指令指针的地址。 1、宏定义 我们先看它们的宏定义 include./linux/kernel.h#define _RET_IP_ (unsigned long)__builtin_return_address(0)#define _THIS_IP_ ({ __labe…...

开源|上海AILab:自动驾驶仿真平台LimSim Series,兼容端到端/知识驱动/模块化技术路线

导读 随着自动驾驶技术快速发展&#xff0c;有效的仿真环境成为验证与增强这些系统的关键。来自上海人工智能实验室的研究团队推出了LimSim Series——一个革命性的自动驾驶仿真平台&#xff0c;它巧妙解决了行业面临的三大挑战&#xff1a;仿真精度与持续时间的平衡、功能性与…...

全栈黑暗物质:可观测性之外的非确定性调试

一、量子计算的测不准Bug 1. 经典 vs. 量子系统的错误模式 量子程序崩溃的观测影响&#xff1a; 调试方法崩溃复现率观测干扰度日志打印12%35%断点调试5%78%无侵入跟踪27%9%量子态层析成像63%2% 二、量子调试工具箱 1. 非破坏性观测协议 # 量子程序的无干扰快照 from qiski…...

光耦、继电器

一、光耦 1.什么是光耦&#xff1f; ①图一:Ic受控于Ib&#xff0c;间接受控于Ia ②如果Va和Vb是隔离的两个电压系统该咋控制&#xff1f;可以利用光耦来控制&#xff0c;让两边建立关系 2.光电耦合器的基本原理 ①是以光为媒介来传输电信号的器件&#xff0c;通常把发光器…...

使用Three.js搭建自己的3Dweb模型(从0到1无废话版本)

教学视频参考&#xff1a;B站——Three.js教学 教学链接&#xff1a;Three.js中文网 老陈打码 | 麒跃科技 一.什么是Three.js&#xff1f; Three.js​ 是一个基于 JavaScript 的 ​3D 图形库&#xff0c;用于在网页浏览器中创建和渲染交互式 3D 内容。它基于 WebGL&#xff0…...

Redis远程链接应用案例

1.配置文件设置 打开配置文件redis.windows.conf&#xff0c;配置以下内容&#xff1a; 1.bind 0.0.0.0&#xff08;设置所有IP可访问&#xff09; 2.requirepass 1234.com&#xff08;密码设置&#xff09; 3.protected-mode no&#xff08;远程可访问&#xff09; 2.防火…...

STM32 定时器TIM

定时器基础知识 定时器就是用来定时的机器&#xff0c;是存在于STM32单片机中的一个外设。STM32总共有8个定时器&#xff0c;分别是2个高级定时器(TIM1、TIM8)&#xff0c;4个通用定时器(TIM2、TIM3、TIM4、TIM5)和2个基本定时器(TIM6、TIM7)&#xff0c;如下图所示: STM32F1…...

基于大模型的急性化脓性阑尾炎全程诊疗预测与方案研究

目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目标与方法 二、大模型技术原理与应用基础 2.1 大模型概述 2.2 相关技术原理 2.3 数据收集与预处理 三、术前风险预测与准备 3.1 病情评估指标分析 3.2 大模型预测方法与结果 3.3 术前准备方案 四、…...

第一个 servlet请求

文章目录 前端后端前后端 产生 联系 前端 后端 package com.yanyu;import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse;import java.io.I…...

XLSX.utils.sheet_to_json设置了blankrows:true,但无法获取到开头的空白行

在用sheetJs的XLSX库做导入&#xff0c;遇到一个bug。如果开头行是空白行的话&#xff0c;调用sheet_to_json转数组获得的数据也是没有包含空白行的。这样会导致在设置对应的起始行时&#xff0c;解析数据不生效。 目前是直接跳过了开头的两行空白行 正确应该获得一下数据 问…...

python一款简单的数据库同步dts小实现

一、实现说明 在数据开发与运维场景中&#xff0c;数据库同步是一项基础且高频的需求。无论是开发环境与生产环境的数据镜像&#xff0c;还是多数据库之间的数据分发&#xff0c;都需要可靠的同步工具。本文将基于 Python 和pymysql库&#xff0c;实现一个轻量级数据库同步工具…...

误触网络重置,笔记本电脑wifi连接不上解决方法(Win10,Win11通用)

笔记本电脑连接不上网&#xff0c;有人说网络重置按钮可以解决&#xff0c;结果把wifi图标都给搞没了&#xff0c;只剩飞行模式&#xff0c;解决方法&#xff08;错误码39&#xff09;&#xff0c;罪魁祸首就是这个网络重置&#xff0c;一下连网络都检测不到了 那么没有网络怎…...

markdown-it-katex 安装和配置指南

markdown-it-katex 是一个用于 Markdown-it 的插件&#xff0c;旨在通过 KaTeX 库在 Markdown 文档中添加数学公式支持。KaTeX 是一个快速渲染数学公式的库&#xff0c;相比于 MathJax&#xff0c;它在性能上有显著优势。 步骤 1: 安装 Markdown-it 首先&#xff0c;你需要安装…...

开源财务软件:企业财务数字化转型的有力工具

在当今数字化时代&#xff0c;企业财务数字化转型已成为必然趋势。随着业务的不断拓展和复杂化&#xff0c;企业对财务软件的需求也在日益增长。然而&#xff0c;传统商业财务软件往往伴随着高昂的授权费用和有限的定制化能力&#xff0c;这让许多企业&#xff0c;尤其是中小企…...

大模型——Suna集成浏览器操作与数据分析的智能代理

大模型——Suna集成浏览器操作与数据分析的智能代理 Suna 是 Kortix AI 开发的一个开源通用 AI 代理,托管在 GitHub 上,基于 Apache 2.0 许可证,允许用户免费下载、修改和自托管。它通过自然语言对话帮助用户完成复杂任务,如网页浏览、文件管理、数据抓取和网站部署。Suna…...

QT中的事件及其属性

Qt中的事件是对操作系统提供的事件机制进行封装&#xff0c;Qt中的信号槽就是对事件机制的进一步封装 但是特殊情况下&#xff0c;如对于没有提供信号的用户操作&#xff0c;就需要通过重写事件处理的形式&#xff0c;来手动处理事件的响应逻辑 常见的Qt事件&#xff1a; 常见事…...

flutter 选择图片 用九宫格显示图片,右上角X删除选择图片,点击查看图片放大缩小,在多张图片可以左右滑动查看图片

flutter 选择图片 用九宫格显示图片&#xff0c;右上角X删除选择图片&#xff0c;点击查看图片放大缩小&#xff0c;在多张图片可以左右滑动查看图片 ************ 暂无压缩图片功能 ********* 显示图片 — import dart:io;import package:flutter/material.dart; import pa…...

机器学习day2-seaborn绘图练习

1.使用tips数据集&#xff0c;创建一个展示不同时间段(午餐/晚餐)账单总额分布的箱线图 import seaborn as sns import matplotlib.pyplot as plt import pandas as pd import numpy as np# 设置主题 sns.set_theme(style"darkgrid")# 设置中文 plt.rcParams[font.s…...

如何优雅地解决AI生成内容粘贴到Word排版混乱的问题?

随着AI工具的广泛应用&#xff0c;越来越多人开始使用AI辅助撰写论文、报告或博客。然而&#xff0c;当我们直接将AI生成的文本复制到Word文档中时&#xff0c;常常会遇到排版混乱、格式异常的问题。这是因为大部分AI输出时默认使用了Markdown格式&#xff0c;而Word对Markdown…...

设计一个食品种类表

需求&#xff1a;设计一个食品种类表&#xff0c;注意食品种类有多层&#xff0c;比如面食下面&#xff0c;面条、方便面&#xff0c;面条下有干面、湿面等 一、食品种类表结构设计&#xff08;food_category&#xff09; CREATE TABLE food_category (category_id INT IDENT…...

Haply MinVerse触觉3D 鼠标—沉浸式数字操作,助力 3D 设计与仿真

在2025年CES展上&#xff0c;Haply MinVerse触觉3D鼠标凭借创新交互方式引发关注。这款设备为用户与数字环境的互动带来新维度&#xff0c;操作虚拟物体时能感受真实触觉反馈。 三维交互与触觉反馈 MinVerse 突破传统鼠标二维限制&#xff0c;增加第三运动轴&#xff0c;实现真…...

神经网络预测评估机制:损失函数详解

文章目录 一、引言二、损失函数的引入三、回顾预测算法四、损失函数的形式五、成本函数六、损失函数的定义与作用七、损失函数的重要性注释思维导图 一、引言 在上一篇文章中&#xff0c;我们了解到神经网络可通过逻辑回归等算法对输入进行预测。而判断预测结果是否准确至关重要…...

PHP实现 Apple ID 登录的服务端验证指南

在 iOS 应用中启用 “通过 Apple 登录”&#xff08;Sign In with Apple&#xff09;后&#xff0c;客户端会获取一个 身份令牌&#xff08;identity token&#xff09;。该令牌是一个JWT&#xff08;JSON Web Token&#xff09;&#xff0c;需要由服务端验证其真实性和完整性&…...

一、linux系统启动过程操作记录

一、linux系统启动过程 经历&#xff1a; 上电–>uboot–>加载内核–>挂载根文件系统–>执行应用程序 uboot等效bootloader&#xff0c;启动过程进行了 跳转到固定的位置执行相应的代码 初始化硬件设备&#xff0c;如&#xff1a;cpu初始化 &#xff0c;看门狗&a…...

【首款Armv9开源芯片“星睿“O6测评】SVE2指令集介绍与测试

SVE2指令集介绍与测试 一、什么是SVE2 在Neon架构扩展&#xff08;其指令集向量长度固定为128位&#xff09;的基础上&#xff0c;Arm设计了可伸缩向量扩展&#xff08;Scalable vector extension&#xff0c; SVE&#xff09;。SVE是一种新的单指令多数据&#xff08;SIMD&am…...

获取电脑mac地址

Windows 系统 方法1:通过命令提示符 1. 按下 `Win + R`,输入 `cmd` 后按回车,打开命令提示符。 2. 输入以下命令并按回车:...

AI核心技术与应用场景的深度解析

AI核心技术与应用场景的深度解析 在互联网大厂Java求职者的面试中&#xff0c;经常会被问到关于AI核心技术与应用场景的问题。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官&#xff1a;马架构&#xff0c;欢迎来到我们公司的面试现场。请问您对AI…...

练习普通话,声音细柔和

《繁星》 我爱月夜&#xff0c;但我也爱星天。从前在家乡七八月 的夜晚&#xff0c;在庭院里纳凉的时候&#xff0c;我最爱看天上密密 麻麻的繁星。望着星天&#xff0c;我就会忘记一切&#xff0c;仿佛回 到了母亲的怀里似的。 三年前在南京我住的地方&#xff0c;有…...

Linux进程详细解析

1.操作系统 概念 任何计算机系统都包含⼀个基本的程序集合&#xff0c;称为操作系统(OS)。笼统的理解&#xff0c;操作系统包括&#xff1a; • 内核&#xff08;进程管理&#xff0c;内存管理&#xff0c;文件管理&#xff0c;驱动管理&#xff09; • 其他程序&#xff08…...

Linux执行脚本报错

执行脚本报错&#xff1a;./startup.sh -bash: ./startup.sh: /bin/bash^M: bad interpreter: No such file or directory ./startup.sh -bash: ./startup.sh: /bin/bash^M: bad interpreter: No such file or directory可能的原因&#xff1a; 文件开头格式问题&#xff1a…...

C++学习:六个月从基础到就业——模板编程:类模板

C学习&#xff1a;六个月从基础到就业——模板编程&#xff1a;类模板 本文是我C学习之旅系列的第三十三篇技术文章&#xff0c;也是第二阶段"C进阶特性"的第十一篇&#xff0c;主要介绍C中的类模板编程。查看完整系列目录了解更多内容。 目录 引言类模板的基本语法…...

Conda 虚拟环境复用

文章目录 一、导出环境配置二、克隆环境配置三、区别小结 一、导出环境配置 导出&#xff1a;将当前虚拟环境导出成一个yml配置文件。conda activate your_env conda env export > your_env.yml导入&#xff1a;基于yml文件创建新环境&#xff0c;会自动按照yml里的配置&am…...

Nacos简介—4.Nacos架构和原理三

大纲 1.Nacos的定位和优势 2.Nacos的整体架构 3.Nacos的配置模型 4.Nacos内核设计之一致性协议 5.Nacos内核设计之自研Distro协议 6.Nacos内核设计之通信通道 7.Nacos内核设计之寻址机制 8.服务注册发现模块的注册中心的设计原理 9.服务注册发现模块的注册中心的服务数…...

4月27日日记

现在想来&#xff0c;可以想到什么就记录下来&#xff0c;这也是网上写日记的一个好处&#xff0c;然后 今天英语课上看到一个有关迷信的视频&#xff0c;就是老师课件里的&#xff0c;感觉画风很不错&#xff0c;但是我贫瘠的语言形容不出来&#xff0c;就想到是不是世界上的…...

CentOS7.9安装OpenSSL 1.1.1t和OpenSSH9.9p1

一、临时开启telnet登录方式&#xff0c;避免升级失败无法登录系统 &#xff08;注意telnet登录方式存在安全隐患&#xff0c;升级openssh相关服务后要记得关闭&#xff09; 1.安装telnet服务 yum -y install xinetd telnet* 2.允许root用户通过telnet登陆&#xff0c;编辑…...

单例模式:全局唯一性在软件设计中的艺术实践

引言 在软件架构设计中&#xff0c;单例模式&#xff08;Singleton Pattern&#xff09;以其独特的实例控制能力&#xff0c;成为解决资源复用与全局访问矛盾的经典方案。该模式通过私有化构造方法、静态实例存储与全局访问接口三大核心机制&#xff0c;确保系统中特定类仅存在…...

Spring 与 ActiveMQ 的深度集成实践(三)

五、实战案例分析 5.1 案例背景与需求 假设我们正在开发一个电商系统&#xff0c;其中订单模块和库存模块是两个独立的子系统 。当用户下单后&#xff0c;订单模块需要通知库存模块进行库存扣减操作 。在传统的同步调用方式下&#xff0c;订单模块需要等待库存模块完成扣减操…...

30-算法打卡-字符串-重复的子字符串-leetcode(459)-第三十天

1 题目地址 459. 重复的子字符串 - 力扣&#xff08;LeetCode&#xff09;459. 重复的子字符串 - 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1:输入: s "abab"输出: true解释: 可由子串 "ab" 重复两次构成…...

rocketmq一些异常记录

rocketmq一些异常记录 Product 设置不重复发送 发送 一次失败&#xff0c;不会在被发送到mq消息队列中&#xff0c;相当于消息丢失。 2、 Consumer 消费失败 重试三次消费 都失败 则消息消费失败&#xff0c;失败后 会放入 死信队列&#xff0c;可以手动处理在mq面板 处理死信队…...

SQLMesh 测试自动化:提升数据工程效率

在现代数据工程中&#xff0c;确保数据模型的准确性和可靠性至关重要。SQLMesh 提供了一套强大的测试工具&#xff0c;用于验证数据模型的输出是否符合预期。本文将深入探讨 SQLMesh 的测试功能&#xff0c;包括如何创建测试、支持的数据格式以及如何运行和调试测试。 SQLMesh …...

WPF使用SQLite与JSON文本文件结合存储体侧平衡数据的设计与实现

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

关系型数据库PostgreSQL vs MySQL 深度对比:专业术语+白话解析+实战案例

PostgreSQL 与 MySQL 的详细对比 PostgreSQL 和 MySQL 是两种最流行的开源关系型数据库&#xff0c;它们在设计理念、功能特性和适用场景上有显著差异。以下是它们的详细对比&#xff1a; 一、基本架构与设计理念 PostgreSQL&#xff1a;多进程架构&#xff0c;使用共享内存通…...

利用 SSRF 和 Redis 渗透

环境搭建 在本次实验中&#xff0c;我们使用 Docker 环境进行测试。 解压实验包&#xff0c;搭建 docker 环境。 docker环境 web的dockerfile 主要利用代码 &#xff1a; redis服务器 通过 docker-compose up -d 启动相关容器&#xff0c;初次启动失败。 发现 docker 版本问…...

脏读、幻读、可重复读

脏读 定义&#xff1a;一个事务读取了另一个事务尚未提交的数据 。比如事务 A 修改了某条数据但还没提交&#xff0c;此时事务 B 读取了这条被修改但未提交的数据。若事务 A 后续回滚&#xff0c;事务 B 读到的数据就是无效的&#xff0c;相当于读到了 “脏数据”。危害&#…...

第1讲、#PyTorch教学环境搭建与Tensor基础操作详解

引言 PyTorch是当前深度学习领域最流行的框架之一&#xff0c;因其动态计算图和直观的API而备受开发者青睐。本文将从零开始介绍PyTorch的环境搭建与基础操作&#xff0c;适合各种平台的用户和深度学习初学者。 1. 安装和环境搭建 macOS (Apple Silicon) 对于Mac M1/M2/M3用…...

【创新实训个人博客】数据库搭建

1.原因 为了降低模型使用以前训练的数据或者幻觉知识&#xff0c;我们在对话时需要提供相关内容的数据&#xff0c;同时由于需要最新的广告实时数据&#xff0c;实时爬取和版权问题。数据由团队在网上爬取&#xff0c;为了广告内容的有效性&#xff0c;如果长期使用&#xff0…...