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

【C++】异常

前言

本篇博客我们来看下C++有关异常的处理,了解下异常有关的知识

💓 个人主页:小张同学zkf

⏩ 文章专栏:C++

若有问题 评论区见📝

🎉欢迎大家点赞👍收藏⭐文章 ​

目录

1.异常的概念及使用

 1.1异常的概念

1.2异常的抛出和捕获

1.3栈展开

1.4查找匹配的处理代码

1.5异常重新抛出

 1.6异常安全问题

1.7异常规范

2.标准库的异常


1.异常的概念及使用

 1.1异常的概念

异常处理机制允许程序中独⽴开发的部分能够在运⾏时就出现的问题进⾏通信并做出相应的处理,
异常使得我们能够将问题的检测与解决问题的过程分开,程序的⼀部分负责检测问题的出现,然后
解决问题的任务传递给程序的另⼀部分,检测环节⽆须知道问题的处理模块的所有细节。
C语⾔主要通过错误码的形式处理错误,错误码本质就是对错误信息进⾏分类编号,拿到错误码以
后还要去查询错误信息,⽐较⿇烦。异常时抛出⼀个对象,这个对象可以函数更全⾯的各种信息。

1.2异常的抛出和捕获

程序出现问题时,我们通过抛出(throw)⼀个对象来引发⼀个异常,该对象的类型以及当前的调⽤
链决定了应该由哪个catch的处理代码来处理该异常。
被选中的处理代码是调⽤链中与该对象类型匹配且离抛出异常位置最近的那⼀个。根据抛出对象的
类型和内容,程序的抛出异常部分告知异常处理部分到底发⽣了什么错误。
当throw执⾏时,throw后⾯的语句将不再被执⾏。程序的执⾏从throw位置跳到与之匹配的catch
模块,catch可能是同⼀函数中的⼀个局部的catch,也可能是调⽤链中另⼀个函数中的catch,控
制权从throw位置转移到了catch位置。这⾥还有两个重要的含义:1、沿着调⽤链的函数可能提早
退出。2、⼀旦程序开始执⾏异常处理程序,沿着调⽤链创建的对象都将销毁。
抛出异常对象后,会⽣成⼀个异常对象的拷⻉,因为抛出的异常对象可能是⼀个局部对象,所以会
⽣成⼀个拷⻉对象,这个拷⻉的对象会在catch⼦句后销毁。(这⾥的处理类似于函数的传值返
回)

1.3栈展开

抛出异常后,程序暂停当前函数的执⾏,开始寻找与之匹配的catch⼦句,⾸先检查throw本⾝是否
在try块内部,如果在则查找匹配的catch语句,如果有匹配的,则跳到catch的地⽅进⾏处理。
如果当前函数中没有try/catch⼦句,或者有try/catch⼦句但是类型不匹配,则退出当前函数,继续
在外层调⽤函数链中查找,上述查找的catch过程被称为栈展开。
如果到达main函数,依旧没有找到匹配的catch⼦句,程序会调⽤标准库的 terminate 函数终⽌
程序。
如果找到匹配的catch⼦句处理后,catch⼦句代码会继续执⾏。

double Divide ( int a, int b)
{
try
{
// b == 0 时抛出异常
if (b == 0 )
{
string s ( "Divide by zero condition!" );
throw s;
}
else
{
return (( double )a / ( double )b);
}
}
catch ( int errid)
{
cout << errid << endl;
}
return 0 ;
}
void Func ()
{
int len, time;
cin >> len >> time;
try
{
cout << Divide (len, time) << endl;
}
catch ( const char * errmsg)
{
cout << errmsg << endl;
}
cout <<__FUNCTION__<< ":" << __LINE__ << " ⾏执⾏ " << endl;
}
int main ()
{
while ( 1 )
{
try
{
Func ();
}
catch ( const string& errmsg)
{
cout << errmsg << endl;
}
}
return 0 ;
}

1.4查找匹配的处理代码

⼀般情况下抛出对象和catch是类型完全匹配的,如果有多个类型匹配的,就选择离他位置更近的
那个。
但是也有⼀些例外,允许从⾮常量向常量的类型转换,也就是权限缩⼩;允许数组转换成指向数组
元素类型的指针,函数被转换成指向函数的指针;允许从派⽣类向基类类型的转换,这个点⾮常实
⽤,实际中继承体系基本都是⽤这个⽅式设计的。
如果到main函数,异常仍旧没有被匹配就会终⽌程序,不是发⽣严重错误的情况下,我们是不期望程序终⽌的,所以⼀般main函数中最后都会使⽤catch(...),它可以捕获任意类型的异常,但是是
不知道异常错误是什么。
1 # include <thread>
2
3 // ⼀般⼤型项⽬程序才会使⽤异常,下⾯我们模拟设计⼀个服务的⼏个模块
4 // 每个模块的继承都是 Exception 的派⽣类,每个模块可以添加⾃⼰的数据
5 // 最后捕获时,我们捕获基类就可以
6 class Exception
7 {
8 public :
9 Exception ( const string& errmsg, int id)
10 :_errmsg(errmsg)
11 , _id(id)
12 {}
13
14 virtual string what () const
15 {
16 return _errmsg;
17 }
18
19 int getid () const
20 {
21 return _id;
22 }
23
24 protected :
25 string _errmsg;
26 int _id;
27 };
28
29 class SqlException : public Exception
30 {
31 public :
32 SqlException ( const string& errmsg, int id, const string& sql)
33 : Exception (errmsg, id)
34 , _sql(sql)
35 {}
36
37 virtual string what () const
38 {
39 string str = "SqlException:" ;
40 str += _errmsg;
41 str += "->" ;
42 str += _sql;
43 return str;
44 }
45 private :
46 const string _sql;
47 };
48 49 class CacheException : public Exception
50 {
51 public :
52 CacheException ( const string& errmsg, int id)
53 : Exception (errmsg, id)
54 {}
55
56 virtual string what () const
57 {
58 string str = "CacheException:" ;
59 str += _errmsg;
60 return str;
61 }
62 };
63
64 class HttpException : public Exception
65 {
66 public :
67 HttpException ( const string& errmsg, int id, const string& type)
68 : Exception (errmsg, id)
69 , _type(type)
70 {}
71
72 virtual string what () const
73 {
74 string str = "HttpException:" ;
75 str += _type;
76 str += ":" ;
77 str += _errmsg;
78 return str;
79 }
80
81 private :
82 const string _type;
83 };
84
85 void SQLMgr ()
86 {
87 if ( rand () % 7 == 0 )
88 {
89 throw SqlException ( " 权限不⾜ " , 100 , "select * from name = ' 张三 '" );
90 }
91 else
92 {
93 cout << "SQLMgr 调⽤成功 " << endl;
94 }
95 }
96
97 void CacheMgr ()
98 {
99 if ( rand () % 5 == 0 )
100 {
101 throw CacheException ( " 权限不⾜ " , 100 );
102 }
103 else if ( rand () % 6 == 0 )
104 {
105 throw CacheException ( " 数据不存在 " , 101 );
106 }
107 else
108 {
109 cout << "CacheMgr 调⽤成功 " << endl;
110 }
111
112 SQLMgr ();
113 }
114
115 void HttpServer ()
116 {
117 if ( rand () % 3 == 0 )
118 {
119 throw HttpException ( " 请求资源不存在 " , 100 , "get" );
120 }
121 else if ( rand () % 4 == 0 )
122 {
123 throw HttpException ( " 权限不⾜ " , 101 , "post" );
124 }
125 else
126 {
127 cout << "HttpServer 调⽤成功 " << endl;
128 }
129
130 CacheMgr ();
131 }
132
133
134 int main ()
135 {
136 srand ( time ( 0 ));
137
138 while ( 1 )
139 {
140 this_thread:: sleep_for (chrono:: seconds ( 1 ));
141
142 try
143 {
144 HttpServer ();
145 }
146 catch ( const Exception& e) // 这⾥捕获基类,基类对象和派⽣类对象都可以被
捕获
147 {
148 cout << e. what () << endl;
149 }
150 catch (...)
151 {
152 cout << "Unkown Exception" << endl;
153 }
154 }
155
156 return 0 ;
157 }

1.5异常重新抛出

有时catch到⼀个异常对象后,需要对错误进⾏分类,其中的某种异常错误需要进⾏特殊的处理,其他错误则重新抛出异常给外层调⽤链处理。捕获异常后需要重新抛出,直接 throw; 就可以把捕获的对象直接抛出。
1 // 下⾯程序模拟展⽰了聊天时发送消息,发送失败补货异常,但是可能在
2 // 电梯地下室等场景⼿机信号不好,则需要多次尝试,如果多次尝试都发
3 // 送不出去,则就需要捕获异常再重新抛出,其次如果不是⽹络差导致的
4 // 错误,捕获后也要重新抛出。
5 void _SeedMsg( const string& s)
6 {
7 if ( rand () % 2 == 0 )
8 {
9 throw HttpException ( " ⽹络不稳定,发送失败 " , 102 , "put" );
10 }
11 else if ( rand () % 7 == 0 )
12 {
13 throw HttpException ( " 你已经不是对象的好友,发送失败 " , 103 , "put" );
14 }
15 else
16 {
17 cout << " 发送成功 " << endl;
18 }
19 }
20
21 void SendMsg ( const string& s)
22 {
23 // 发送消息失败,则再重试 3
24 for ( size_t i = 0 ; i < 4 ; i++)
25 {
26 try
27 {
28 _SeedMsg(s);
29 break ;
30 }
31 catch ( const Exception& e)
32 {
33 // 捕获异常, if 中是 102 号错误,⽹络不稳定,则重新发送
34 // 捕获异常, else 中不是 102 号错误,则将异常重新抛出
35
36 if (e. getid () == 102 )
37 {
38 // 重试三次以后否失败了,则说明⽹络太差了,重新抛出异常
39 if (i == 3 )
40 throw ;
41
42 cout << " 开始第 " << i + 1 << " 重试 " << endl;
43 }
44 else
45 {
46 throw ;
47 }
48 }
49 }
50 }
51
52 int main ()
53 {
54 srand ( time ( 0 ));
55
56 string str;
57 while (cin >> str)
58 {
59 try
60 {
61 SendMsg (str);
62 }
63 catch ( const Exception& e)
64 {
65 cout << e. what () << endl << endl;
66 }
67 catch (...)
68 {
69 cout << "Unkown Exception" << endl; }
70}
71return 0 ;
72}

 1.6异常安全问题

异常抛出后,后⾯的代码就不再执⾏,前⾯申请了资源(内存、锁等),后⾯进⾏释放,但是中间可
能会抛异常就会导致资源没有释放,这⾥由于异常就引发了资源泄漏,产⽣安全性的问题。中间我
们需要捕获异常,释放资源后⾯再重新抛出,当然后⾯智能指针章节讲的RAII⽅式解决这种问题是
更好的。
其次析构函数中,如果抛出异常也要谨慎处理,⽐如析构函数要释放10个资源,释放到第5个时抛
出异常,则也需要捕获处理,否则后⾯的5个资源就没释放,也资源泄漏了。《Effctive C++》第8
个条款也专⻔讲了这个问题,别让异常逃离析构函数。
double Divide ( int a, int b)
{
// b == 0 时抛出异常
if (b == 0 )
{
throw "Division by zero condition!" ;
}
return ( double )a / ( double )b;
}
void Func ()
{
// 这⾥可以看到如果发⽣除 0 错误抛出异常,另外下⾯的 array 没有得到释放。
// 所以这⾥捕获异常后并不处理异常,异常还是交给外层处理,这⾥捕获了再
// 重新抛出去。
int * array = new int [ 10 ];
try
{
int len, time;
cin >> len >> time;
cout << Divide (len, time) << endl;
}
catch (...)
{
// 捕获异常释放内存
cout << "delete []" << array << endl;
delete [] array;
throw ; // 异常重新抛出,捕获到什么抛出什么
}
cout << "delete []" << array << endl;
delete [] array;
}
int main ()
{
try
{
Func ();
}
catch ( const char * errmsg)
{
cout << errmsg << endl;
}
catch ( const exception& e)
{
cout << e. what () << endl;
}
catch (...)
{
cout << "Unkown Exception" << endl;
}
return 0 ;
}

1.7异常规范

对于⽤⼾和编译器⽽⾔,预先知道某个程序会不会抛出异常⼤有裨益,知道某个函数是否会抛出异
常有助于简化调⽤函数的代码。
C++98中函数参数列表的后⾯接throw(),表⽰函数不抛异常,函数参数列表的后⾯接throw(类型1,
类型2...)表⽰可能会抛出多种类型的异常,可能会抛出的类型⽤逗号分割。
C++98的⽅式这种⽅式过于复杂,实践中并不好⽤,C++11中进⾏了简化,函数参数列表后⾯加
noexcept 表⽰不会抛出异常,啥都不加表⽰可能会抛出异常。
编译器并不会在编译时检查noexcept,也就是说如果⼀个函数⽤noexcept修饰了,但是同时⼜包
含了throw语句或者调⽤的函数可能会抛出异常,编译器还是会顺利编译通过的(有些编译器可能会
报个警告)。但是⼀个声明了noexcept的函数抛出了异常,程序会调⽤ terminate 终⽌程序。
noexcept(expression)还可以作为⼀个运算符去检测⼀个表达式是否会抛出异常,可能会则返回
false,不会就返回true。
// C++98
// 这⾥表⽰这个函数只会抛出 bad_alloc 的异常
void * operator new (std:: size_t size) throw (std::bad_alloc);
// 这⾥表⽰这个函数不会抛出异常
void * operator delete (std:: size_t size, void * ptr) throw ();
// C++11
size_type size () const noexcept ;
iterator begin () noexcept ;
const_iterator begin () const noexcept ;
double Divide ( int a, int b) noexcept
{
// b == 0 时抛出异常
if (b == 0 )
{
throw "Division by zero condition!" ;
}
return ( double )a / ( double )b;
}
int main ()
{
try
{
int len, time;
cin >> len >> time;
cout << Divide (len, time) << endl;
}
catch ( const char * errmsg)
{
cout << errmsg << endl;
}
catch (...)
{
cout << "Unkown Exception" << endl;
}
int i = 0 ;
cout << noexcept ( Divide ( 1 , 2 )) << endl;
cout << noexcept ( Divide ( 1 , 0 )) << endl;
cout << noexcept (++i) << endl;
return 0 ;
}


2.标准库的异常

exception - C++ Reference

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


结束语 

C++异常有关方面知识点总结完毕,对于异常容易产生的内存泄露问题,我们可以用智能指针来解决,下片博客我们来看看智能指针相关知识

相关文章:

【C++】异常

前言 本篇博客我们来看下C有关异常的处理&#xff0c;了解下异常有关的知识 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;C 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 ​ 目录 1.异常的概念及使用 1.1异…...

Meta AI 最近推出了一款全新的机器学习框架ParetoQ,专门用于大型语言模型的4-bit 以下量化

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

金融资产配置

不要放在一个篮子里也不要放在太多篮子里&#xff1a; 尽量放在不相关的行业实现风险对冲 金融资产从风险类别上主要可以分为三类&#xff1a; 进攻型资产、稳定型资产和防守型资产 进攻型资产包括原油、股票、一级市场股权投资等 稳定型资产包括信托、理财、国债等 防守…...

(done) openMP学习 (Day14: 总结)

url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#23-%E5%8F%AF%E6%80%95%E7%9A%84%E4%B8%9C%E8%A5%BF%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8Batomicsflushpairwise%E5%90%8C%E6%AD%A5%20 新手并行程序员与专家并行程序员之间的区别是专家have a collection…...

音频进阶学习十一——离散傅里叶级数DFS

文章目录 前言一、傅里叶级数1.定义2.周期信号序列3.表达式DFSIDFS参数含义 4.DFS公式解析1&#xff09;右边解析 T T T、 f f f、 ω \omega ω的关系求和公式N的释义求和公式K的释义 e j ( − 2 π k n N ) e^{j(\frac{-2\pi kn}{N})} ej(N−2πkn​)的释义 ∑ n 0 N − 1 e…...

ssm的心得

spring是一个轻量级的ioc&#xff08;控制反转&#xff09;和aop&#xff08;面向切面编程&#xff09;容器框架&#xff0c;它可以管理和配置应用中的各种bean&#xff08;对象&#xff09;&#xff0c;实现bean之间的依赖注入&#xff0c;以及提供事务管理、缓存、测试等功能…...

14vue3实战-----获取用户信息和用户的菜单树信息

14vue3实战-----获取用户信息和用户的菜单树信息 1.获取用户信息1.1封装接口1.2优化 2.获取用户的菜单树信息 1.获取用户信息 1.1封装接口 后端有根据id获取用户信息的接口&#xff0c;前端需要把该接口封装一下: service/login/login.ts&#xff1a; import hyRequest from…...

shell脚本学习笔记

Shell脚本学习笔记 参考资料&#xff1a;https://www.runoob.com/linux/linux-shell-passing-arguments.html 文章目录 Shell脚本学习笔记一、什么是Shell1.1、定义1.2、注释 二、Shell变量2.1、规则2.2、变量类型2.2.1、字符串2.2.2、整数2.2.3、数组2.2.4、环境变量2.2.5、特…...

Java中的线程池及其应用场景有哪些?

Java中的线程池是一种高效的并发编程机制&#xff0c;通过复用线程来管理任务的执行&#xff0c;从而提高资源利用率和系统性能。 本文将详细探讨Java线程池的概念、类型、应用场景以及实际代码示例&#xff0c;帮助读者全面理解线程池的使用方法及其在实际开发中的重要性。 …...

13.6 基于 LangChain架构优化实战:OpenAI-Translator翻译系统重构与10倍效率提升秘籍

LangChain架构优化实战:OpenAI-Translator翻译系统重构与10倍效率提升秘籍 关键词:LangChain 架构优化, 模块解耦, 翻译系统设计模式, 可扩展翻译框架, 多模型管理 1. 原架构痛点分析 问题维度原实现缺陷LangChain 优化方案大模型耦合直接调用 OpenAI API,切换模型需改代码…...

构建基于 SSE 协议通信的 MCP Server 和 Client

在之前的系列教程中&#xff0c;我们编写的 MCP 服务器与 MCP 客户端是通过 **stdio&#xff08;Standard Input/Output&#xff0c;标准输入输出&#xff09;**来进行交互的。客户端通过启动服务器子进程&#xff0c;并利用标准输入&#xff08;stdin&#xff09;和标准输出&a…...

Docker、Ollama、Dify 及 DeepSeek 安装配置与搭建企业级本地私有化知识库实践

在现代企业中&#xff0c;管理和快速访问知识库是提升工作效率、促进创新的关键。为了满足这些需求&#xff0c;企业越来越倾向于构建本地私有化的知识库系统&#xff0c;这样可以更好地保护企业数据的安全性和隐私性。本文将介绍如何利用 **Docker**、**Ollama**、**Dify** 和…...

第3章 使用 Vue 脚手架

第3章 使用 Vue 脚手架 3.1 初始化脚手架3.1.1 说明3.1.2. 具体步骤3.1.3 分析脚手架结构1 总结2 细节分析1 配置文件2 src文件1 文件结构分析2 例子 3 public文件4 最终效果 3.2 ref属性3.3 props配置项3.4 mixin混入3.5 插件3.6 scoped样式3.7 Todo-list 案例3.7.1 组件化编码…...

MySQL第五次作业

根据图片内容完成作业 1.建表 &#xff08;1&#xff09;建立两个表:goods(商品表)、orders(订单表) mysql> create table goods( -> gid char(8) primary key, -> name varchar(10), -> price decimal(8,2), -> num int); mysql> create t…...

pikachu[皮卡丘] 靶场全级别通关教程答案 以及 学习方法 如何通过渗透测试靶场挑战「pikachu」来精通Web渗透技巧? 一篇文章搞完这些问题

目录 Pikachu靶场 部署 暴力破解漏洞 学习地址: 靶场练习: 基于表单的暴力破解 验证码绕过(on server) 验证码绕过(on Client) token防爆破? XSS跨站脚本攻击 学习地址: 靶场练习&#xff1a; 反射型xss(get) 反射性xss(post) 存储型xss DOM型xss xss盲打 x…...

ai智能DeepSeek 在 Cursor 中的配置与应用实践

DeepSeek 是一款高效的深度搜索引擎&#xff0c;能够为开发者提供更智能、更精准的搜索体验。在数据量大、查询复杂的场景中&#xff0c;DeepSeek 能够帮助提升查询的响应速度和精确度。本文将介绍 DeepSeek 在 Cursor 中的配置与应用&#xff0c;帮助开发者理解如何在实际开发…...

登录到docker里

在Docker中登录到容器通常有两种情况&#xff1a; 登录到正在运行的容器内部&#xff1a;如果你想要进入到正在运行的容器内部&#xff0c;可以使用docker exec命令。 登录到容器中并启动一个shell&#xff1a;如果你想要启动一个容器&#xff0c;并在其中启动一个shell&…...

【大数据技术】搭建完全分布式高可用大数据集群(Kafka)

搭建完全分布式高可用大数据集群(Kafka) kafka_2.13-3.9.0.tgz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 Kafka 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件安装至/opt目录下。 安…...

Java 大视界 -- Java 大数据在智能供应链中的应用与优化(76)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

10.单例模式 (Singleton Pattern)

单例模式的定义 单例模式&#xff08;Singleton Pattern&#xff09; 是一种创建型设计模式&#xff0c;确保一个类在整个程序生命周期中只能有一个实例&#xff0c;并提供一个全局访问点。 特点&#xff1a; 唯一性&#xff1a;保证系统中某个类只能有一个实例。全局访问点…...

Docker 常见问题解决方法

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes常…...

QT-面试

1. C&#xff08;特别是 Qt&#xff09;开发中&#xff0c;内存优化的方法 1. 合理管理对象生命周期&#xff0c;使用智能指针 Qt 提供了 QScopedPointer 和 QSharedPointer 来管理对象生命周期&#xff0c;避免手动 delete 导致的内存泄漏。 2. 减少内存占用 QString、QBy…...

使用java代码操作rabbitMQ收发消息

SpringAMQP 将来我们开发业务功能的时候&#xff0c;肯定不会在控制台收发消息&#xff0c;而是应该基于编程的方式。由于RabbitMQ采用了AMQP协议&#xff0c;因此它具备跨语言的特性。任何语言只要遵循AMQP协议收发消息&#xff0c;都可以与RabbitMQ交互。并且RabbitMQ官方也…...

LeetCode 128: 最长连续序列

LeetCode 128: 最长连续序列 题目: 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums […...

Shapefile格式文件解析和显示

Java实现GIS SHP文件格式的解析和显示&#xff0c;JDK19下编译&#xff0c;awt图形系统显示。 SHP文件对应的属性存储在DBF格式数据库中&#xff0c;解析见&#xff1a;DBASE DBF数据库文件解析_数据库文件在线解析-CSDN博客 解析SHP文件代码&#xff1a; public static Shap…...

华为昇腾Altas产品查询——常用命令汇总记录

参考链接&#xff1a; 【2024第一期CANN训练营】Altas产品查询CANN软件包版本等信息npu-smi Atlas 中心训练服务器 6.0.0 NPU驱动和固件安装指南 06 Ascend Extension for PyTorch插件软件版本配套表 以下操作适用于查询npu设备的基本信息。 #查询所有设备的基本信息 npu-smi…...

韶音科技:消费电子行业售后服务实现数字化转型,重塑客户服务体系

韶音科技&#xff1a;消费电子行业售后服务实现数字化转型&#xff0c;重塑客户服务体系 在当今这个科技日新月异的时代&#xff0c;企业之间的竞争早已超越了单纯的产品质量比拼&#xff0c;**售后服务成为了衡量消费电子行业各品牌实力与客户满意度的关键一环。**深圳市韶音…...

【R语言】plyr包和dplyr包

一、plyr包 plyr扩展包主要是实现数据处理中的“分割-应用-组合”&#xff08;split-apply-combine&#xff09;策略。此策略是指将一个问题分割成更容易操作的部分&#xff0c;再对每一部分进行独立的操作&#xff0c;最后将各部分的操作结果组合起来。 plyr扩展包中的主要函…...

开发一款类似《王者荣耀》的游戏是一个复杂的系统工程,涉及多个领域的知识和技术。以下是从多个角度详细阐述如何开发的思维。

一、明确游戏定位与核心玩法 游戏类型 MOBA&#xff08;Multiplayer Online Battle Arena&#xff09;&#xff1a;强调团队合作、策略性和即时战斗。确定游戏模式&#xff08;如5v5、3v3等&#xff09;和地图设计。 核心玩法 角色设计&#xff1a;英雄技能、属性、成长曲线。…...

harmonyOS生命周期详述

harmonyOS的生命周期分为app(应用)的生命周期和页面的生命周期函数两部分 应用的生命周期-app应用 在app.js中写逻辑,具体有哪些生命周期函数呢,请看下图: onCreated()、onShow()、onHide()、onDestroy()这五部分 页面及组件生命周期 着重说下onShow和onHide,分别代表是不是…...

Deepseek本地部署指南:在linux服务器部署,在mac远程web-ui访问

1. 在Linux服务器上部署DeepSeek模型 要在 Linux 上通过 Ollama 安装和使用模型&#xff0c;您可以按照以下步骤进行操作&#xff1a; 步骤 1&#xff1a;安装 Ollama 安装 Ollama&#xff1a; 使用以下命令安装 Ollama&#xff1a; curl -sSfL https://ollama.com/download.…...

ESP8266+STM32+阿里云保姆级教程(AT指令+MQTT)

前言&#xff1a;在开发过程中&#xff0c;几乎踩便了所有大坑小坑总结出的文章&#xff0c;我是把坑踩满了&#xff0c;帮助更过小白快速上手&#xff0c;如有错误之处&#xff0c;还麻烦各位大佬帮忙指正、 目录 一、ESP-01s介绍 1、ESP-01s管脚功能&#xff1a; 模组启动模…...

【蓝桥杯嵌入式】4_key:单击+长按+双击

全部代码网盘自取 链接&#xff1a;https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码&#xff1a;3ii2 1、电路图 将4个按键的引脚设置为input&#xff0c;并将初始状态设置为Pull-up&#xff08;上拉输入&#xff09; 为解决按键抖动的问题&#xff0c;我们…...

TCP队头阻塞问题以及QUIC解决方案

TCP队头阻塞(Head-of-Line Blocking)问题 问题描述 TCP是面向字节流的可靠传输协议,要求数据按严格顺序到达接收端。若某个数据包在传输过程中丢失、延迟或乱序,会导致以下问题: 后续数据被阻塞:接收端必须等待丢失/延迟的包重传并正确接收后,才能将后续已到达的数据交…...

idea启动报错# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffccf76e433

# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc0x00007ffccf76e433, pid17288, tid6696 # # JRE version: (11.0.248) (build ) # Java VM: OpenJDK 64-Bit Server VM (11.0.248-LTS, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64) 不知道为什么…...

如何利用Python爬虫获取商品销量详情:应对eBay反爬策略的实战指南与代码示例

在当今数据驱动的商业环境中&#xff0c;获取商品销量数据对于市场分析、竞品研究和商业决策至关重要。然而&#xff0c;像eBay这样的大型电商平台通常会部署多种反爬虫机制来保护其数据。本文将详细介绍如何利用Python编写爬虫程序&#xff0c;获取eBay商品的销量详情&#xf…...

激活函数篇 03 —— ReLU、LeakyReLU、RandomizedLeakkyReLU、PReLU、ELU

本篇文章收录于专栏【机器学习】 以下是激活函数系列的相关的所有内容: 一文搞懂激活函数在神经网络中的关键作用 逻辑回归&#xff1a;Sigmoid函数在分类问题中的应用 整流线性单位函数&#xff08;Rectified Linear Unit, ReLU&#xff09;&#xff0c;又称修正线性单元&a…...

算法基础之八大排序

文章目录 概要1. 冒泡排序&#xff08;Bubble Sort&#xff09;2. 选择排序&#xff08;Selection Sort&#xff09;3. 插入排序&#xff08;Insertion Sort&#xff09;4. 希尔排序&#xff08;Shell Sort&#xff09;5. 归并排序&#xff08;Merge Sort&#xff09;6. 快速排…...

通达OA /mysql/index.php 未授权访问漏洞

通达OA /mysql/index.php 未授权访问漏洞 漏洞描述 通达OA 未授权访问phpmyadmin漏洞&#xff0c;攻击者无需帐号密码可直接访问phpmyadmin&#xff0c;造成数据库泄漏。攻击者可操作数据库执行sql语句&#xff0c;执行恶意操作&#xff0c;进行一步攻击。 威胁等级: 高危 …...

每日学习 设计模式 五种不同的单例模式

狮子大佬原文 https://blog.csdn.net/weixin_40461281/article/details/135050977 第一种 饿汉式 为什么叫饿汉,指的是"饿" 也就是说对象实例在程序启动时就已经被创建好,不管你是否需要,它都会在类加载时立即实例化,也就是说 实例化是在类加载时候完成的,早早的吃…...

C++类和对象

目录 一、类的定义 1.1、类定义格式 1.2、访问限定符 1.3、类域 二、实例化 2.1、实例化概念 2.2、对象大小 三、this指针 四、类的默认成员 4.1、构造函数 4.2、析构函数 4.3、拷贝构造 4.4、赋值运算符重载 4.4.1、运算符重载 4.4.2、赋值运算符重载 4.5、日…...

AI知识库和全文检索的区别

1、AI知识库的作用 AI知识库是基于人工智能技术构建的智能系统&#xff0c;能够理解、推理和生成信息。它的核心作用包括&#xff1a; 1.1 语义理解 自然语言处理&#xff08;NLP&#xff09;&#xff1a;AI知识库能够理解用户查询的语义&#xff0c;而不仅仅是关键词匹配。 …...

docker常用命令及案例

以下是 Docker 的所有常用命令及其案例说明&#xff0c;按功能分类整理&#xff1a; 1. 镜像管理 1.1 拉取镜像 命令: docker pull <镜像名>:<标签>案例: 拉取官方的 nginx 镜像docker pull nginx:latest1.2 列出本地镜像 命令: docker images案例: 查看本地所有…...

webpack【初体验】使用 webpack 打包一个程序

打包前 共 3 个文件 dist\index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Webpack 示例&…...

让office集成deepseek,支持office和WPS办公软件!(体验感受)

导读 AIGC:AIGC是一种新的人工智能技术&#xff0c;它的全称是Artificial Intelligence Generative Content&#xff0c;即人工智能生成内容。 它是一种基于机器学习和自然语言处理的技术&#xff0c;能够自动产生文本、图像、音频等多种类型的内容。这些内容可以是新闻文章、…...

初始数据结构☞复杂度与泛式

一.时间复杂度 定义&#xff1a; 算法的时间复杂度是一个数学函数&#xff0c;算法中的基本操作的执行次数&#xff0c;为算法的时间复杂度。 O渐进表示方法&#xff1a; 原因&#xff1a; 计算时间复杂度时&#xff0c;我们其实并不一定要计算精确的执行次数&#xff0c;而…...

理解UML中的四种关系:依赖、关联、泛化和实现

在软件工程中&#xff0c;统一建模语言&#xff08;UML&#xff09;是一种广泛使用的工具&#xff0c;用于可视化、设计、构造和文档化软件系统。UML提供了多种图表类型&#xff0c;如类图、用例图、序列图等&#xff0c;帮助开发者和设计师更好地理解系统的结构和行为。在UML中…...

go语言中的反射

为什么会引入反射 有时我们需要写一个函数&#xff0c;这个函数有能力统一处理各种值类型&#xff0c;而这些类型可能无法共享同一个接口&#xff0c;也可能布局未知&#xff0c;也有可能这个类型在我们设计函数时还不存在&#xff0c;这个时候我们就可以用到反射。 空接口可…...

【前端】打造自己的hexo博客_hexo一本通

今日更新完毕&#xff0c;建议关注收藏点赞&#xff01; 目录 打造自己的hexo blog挂载到自己的github主页设计自己的theme 打造自己的hexo blog #需要安装git node.js 这里略#安装hexo npm install -g hexo-cli npm install hexo hexo help#<folder>必须是空的 hexo in…...

剪辑学习整理

文章目录 1. 剪辑介绍 1. 剪辑介绍 剪辑可以干什么&#xff1f;剪辑分为哪些种类&#xff1f; https://www.bilibili.com/video/BV15r421p7aF/?spm_id_from333.337.search-card.all.click&vd_source5534adbd427e3b01c725714cd93961af 学完剪辑之后如何找工作or兼职&#…...