第5章:Go语言错误处理和异常
第5章:Go语言错误处理和异常
5.1 错误类型基础
5.1.1 error接口
// error接口定义
type error interface {Error() string
}// 自定义错误
type CustomError struct {Message stringCode int
}func (e *CustomError) Error() string {return fmt.Sprintf("错误码: %d, 信息: %s", e.Code, e.Message)
}
5.1.2 创建和使用错误
// 创建简单错误
func divide(a, b int) (int, error) {if b == 0 {return 0, errors.New("除数不能为零")}return a / b, nil
}func main() {result, err := divide(10, 0)if err != nil {fmt.Println("发生错误:", err)// 处理错误}
}
5.2 错误处理模式
5.2.1 多返回值错误处理
func readFile(filename string) ([]byte, error) {data, err := ioutil.ReadFile(filename)if err != nil {// 错误处理return nil, fmt.Errorf("读取文件失败: %v", err)}return data, nil
}func processFile(filename string) {data, err := readFile(filename)switch {case err == nil:// 正常处理fmt.Println(string(data))case os.IsNotExist(err):fmt.Println("文件不存在")case os.IsPermission(err):fmt.Println("权限不足")default:fmt.Println("未知错误:", err)}
}
5.2.2 错误类型断言
type ValidationError struct {Field stringValue interface{}
}func (e *ValidationError) Error() string {return fmt.Sprintf("验证错误:字段 %s 值 %v 不合法", e.Field, e.Value)
}func validateAge(age int) error {if age < 0 || age > 150 {return &ValidationError{Field: "Age",Value: age,}}return nil
}func main() {err := validateAge(-5)if err != nil {if ve, ok := err.(*ValidationError); ok {fmt.Printf("特定错误处理:%s\n", ve.Error())}}
}
5.3 panic和recover
5.3.1 panic触发
func riskyOperation() {panic("发生严重错误")
}func main() {riskyOperation() // 程序将立即终止
}
5.3.2 recover捕获异常
func recoverExample() {defer func() {if r := recover(); r != nil {fmt.Println("捕获到panic:", r)// 可以进行日志记录、资源清理等}}()// 模拟可能发生panic的代码panic("unexpected error")
}func main() {recoverExample()fmt.Println("程序继续执行")
}
5.4 自定义错误处理
5.4.1 错误包装
func wrapError(err error) error {return fmt.Errorf("操作失败:%w", err)
}func complexOperation() error {// 模拟底层错误baseErr := errors.New("数据库连接失败")return wrapError(baseErr)
}func main() {err := complexOperation()// 错误解包if errors.Is(err, baseErr) {fmt.Println("匹配到原始错误")}
}
5.4.2 错误日志记录
type Logger struct {file *os.File
}func (l *Logger) LogError(err error) {if err != nil {logEntry := fmt.Sprintf("%s - Error: %v\n", time.Now().Format(time.RFC3339), err)l.file.WriteString(logEntry)}
}func main() {logger, _ := os.OpenFile("error.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)defer logger.Close()customLogger := &Logger{file: logger}err := someRiskyOperation()customLogger.LogError(err)
}
5.5 最佳实践
5.5.1 错误处理原则
- 始终检查错误
- 只处理可以处理的错误
- 在合适的抽象层级传播错误
- 避免忽略错误
- 使用错误包装增加上下文信息
5.5.2 常见错误处理模式
// 错误处理模式示例
func processData(data []byte) error {if len(data) == 0 {return errors.New("数据为空")}// 处理数据的复杂逻辑return nil
}func main() {data := []byte{}if err := processData(data); err != nil {log.Printf("处理失败:%v", err)// 根据不同错误类型采取不同处理策略return}
}
实践项目:简单的配置文件解析器
type Config struct {Database struct {Host stringPort int}
}func parseConfig(filename string) (*Config, error) {data, err := ioutil.ReadFile(filename)if err != nil {return nil, fmt.Errorf("读取配置文件失败: %w", err)}var config Configif err := json.Unmarshal(data, &config); err != nil {return nil, fmt.Errorf("解析配置文件失败: %w", err)}return &config, nil
}func main() {config, err := parseConfig("config.json")if err != nil {switch {case os.IsNotExist(err):log.Fatal("配置文件不存在")case os.IsPermission(err):log.Fatal("无权限读取配置文件")default:log.Fatalf("配置解析错误: %v", err)}}fmt.Printf("数据库配置:%+v\n", config.Database)
}
相关文章:
第5章:Go语言错误处理和异常
第5章:Go语言错误处理和异常 5.1 错误类型基础 5.1.1 error接口 // error接口定义 type error interface {Error() string }// 自定义错误 type CustomError struct {Message stringCode int }func (e *CustomError) Error() string {return fmt.Sprintf(&quo…...
题库刷题知识点总结
算法与机器学习相关 支持向量机:是一种有监督的机器学习算法,用于分类和回归任务。它通过寻找一个最优超平面来将不同类别的数据点分开,最大化两类数据点到超平面的间隔,具有良好的泛化能力和抗噪声能力。机器学习:是…...
GraphRAG:LLM之Graphrag接入milvus
前言 微软目前的graphrag更像个demo,数据量大的时候不是很友好的啊,所以将milvus接入了graphrag,看完这篇文章,其他数据库接入应该也没问题 注:这篇文章只是在search的时候接入进来,index过程或者说整个流…...
adb使用及常用命令
目录 介绍 组成 启用adb调试 常用命令 连接设备 版本信息 安装应用 卸载应用 文件操作 日志查看 屏幕截图和录制 设备重启 端口转发 调试相关 设置属性 设备信息查询 获取帮助 模拟输入 介绍 adb全称为 Android Debug Bridge(Android调试桥),是 A…...
omnipeek分析beacon帧
omnipeek查询设备发送beacon时同一信道两个beacon发送间隔 目录 用例要求分析抓包数据 1.用例要求 Beacon帧发送频率符合规范要求。参数-【同一个信道两个beacon发送间隔不能超过100ms】 2.分析抓包数据 打开becon.pkt文件(用omnipeek工具提前抓取包)…...
Java数组问题
题目2: 定义一个数组,存储1,2,3,4,5,6,7,8,9,10 遍历数组得到的每一个元素,统计数组里面一共多少个能被3整除的数字 package com.s…...
salesforce 可以为同一个简档的同一个 recordtype 的对象设置多种页面布局吗
在 Salesforce 中,对于同一个 Record Type(记录类型),默认情况下,每个 Profile(用户简档) 只能分配一个 Page Layout(页面布局)。也就是说,页面布局的分配规则…...
使用vue项目中,使用webpack模板和直接用vue.config来配置相关插件 区别是什么,具体有哪些提现呢
在 Vue 项目中,使用 Webpack 模板 和 vue.config.js 来配置相关插件的主要区别在于配置的复杂度、灵活性和易用性。以下是两者的详细对比: 1. Webpack 模板 Webpack 模板是 Vue CLI 早期版本(如 Vue CLI 2.x)中提供的项目初始化模…...
五、包图
包图 、基本概念 概念: 用来描述模型中的包和其所含元素的组织方式的图,是维护和控制系统总体结构的重要内容。 包可以把所建立的各种模型组织起来,形成各种功能或用途的模块,并可以控制包中元素的可见性以及描述包之间的依赖…...
关于重构一点简单想法
关于重构一点简单想法 当前工作的组内,由于业务开启的时间正好处于集团php-》go技术栈全面迁移的时间点,组内语言技术栈存在:php、go两套。 因此需求开发过程中通常要考虑两套技术栈的逻辑,一些基础的逻辑也没有办法复用。 在这…...
kafka使用以及基于zookeeper集群搭建集群环境
一、环境介绍 zookeeper下载地址:https://zookeeper.apache.org/releases.html kafka下载地址:https://kafka.apache.org/downloads 192.168.142.129 apache-zookeeper-3.8.4-bin.tar.gz kafka_2.13-3.6.0.tgz 192.168.142.130 apache-zookee…...
GAN对抗生成网络(二)——算法及Python实现
1 算法步骤 上一篇提到的GAN的最优化问题是,本文记录如何求解这一问题。 首先为了表示方便,记,这里让最大的可视作常量。 第一步,给定初始的,使用梯度上升找到 ,最大化。关于梯度下降,可以参考笔者另一篇…...
并发线程(21)——线程池
文章目录 二十一、day211. 线程池实现1.1 完整代码1.2 解释 二十一、day21 我们之前在学习std::future、std::async、std::promise相关的知识时,通过std::promise和packaged_task构建了一个可用的线程池,可参考文章:并发编程(6&a…...
基于32单片机的智能语音家居
一、主要功能介绍 以STM32F103C8T6单片机为控制核心,设计一款智能远程家电控制系统,该系统能实现如下功能: 1、可通过语音命令控制照明灯、空调、加热器、窗户及窗帘的开关; 2、可通过手机显示和控制照明灯、空调、窗户及窗帘的开…...
VScode怎么重启
原文链接:【vscode】vscode重新启动 键盘按下 Ctrl Shift p 打开命令行,如下图: 输入Reload Window,如下图:...
分析服务器 systemctl 启动gozero项目报错的解决方案
### 分析 systemctl start beisen.service 报错 在 Linux 系统中,systemctl 是管理系统和服务的主要工具。当我们尝试重启某个服务时,如果服务启动失败,systemctl 会输出错误信息,帮助我们诊断和解决问题。 本文将通过一个实际的…...
大模型LLM-Prompt-OPTIMAL
1 OPTIMAL OPTIMAL 具体每项内容解释如下: Objective Clarity(目标清晰):明确定义任务的最终目标和预期成果。 Purpose Definition(目的定义):阐述任务的目的和它的重要性。 Information Gat…...
3. 多线程(1) --- 创建线程,Thread类
文章目录 前言1. API2. 创建线程2.1. 继承 Thread类2.2. 实现 Runnable 接口2.3. 匿名内部类2.4. lambda2.5.其他方法 3. Thread类及其常见的方法和属性3.1. Thread 的常见构造方法3.2. Thread 的常见属性3.3. start() --- 启动一个线程3.4. 中断一个线程3.5. 等待线程3.6. 休眠…...
简单的jmeter数据请求学习
简单的jmeter数据请求学习 1.需求 我们的流程服务由原来的workflow-server调用wfms进行了优化,将wfms服务操作并入了workflow-server中,去除了原来的webservice服务调用形式,增加了并发处理,现在想测试模拟一下,在一…...
智能水文:ChatGPT等大语言模型如何提升水资源分析和模型优化的效率
大语言模型与水文水资源领域的融合具有多种具体应用,以下是一些主要的应用实例: 1、时间序列水文数据自动化处理及机器学习模型: ●自动分析流量或降雨量的异常值 ●参数估计,例如PIII型曲线的参数 ●自动分析降雨频率及重现期 ●…...
让机器学习势活过1000K——物理学告知的原子能量模型实现前所未有的模拟稳定性
来源:ScienceAI 本文约1500字,建议阅读5分钟从几何恢复到构象优化,全面验证物理信息力场。机器学习势(MLP)被誉为连接量子力学精度与分子力学效率的圣杯。过去二十年,它们已经能以前所未有的精度重现能量和…...
VMware Unlocker终极指南:3分钟在Windows/Linux上运行macOS虚拟机
VMware Unlocker终极指南:3分钟在Windows/Linux上运行macOS虚拟机 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker VMware Unlocker是一款革命性的开源工具,它能突破VMware对macO…...
Phi-4-mini-reasoning解决软件开发中的复杂依赖冲突问题
Phi-4-mini-reasoning解决软件开发中的复杂依赖冲突问题 1. 引言:依赖冲突的日常困扰 每个开发者都经历过这样的噩梦:项目跑得好好的,突然因为引入一个新库导致整个环境崩溃。控制台里密密麻麻的报错信息,像是一道无解的谜题。特…...
Go语言的sync.RWMutex表现真实
Go语言的sync.RWMutex表现真实 在并发编程中,锁机制是保证数据一致性的核心工具之一。Go语言的sync.RWMutex通过读写分离的设计,在高并发场景下表现出色,既提升了性能,又确保了线程安全。它的表现不仅体现在高效的锁竞争管理上&a…...
避坑指南:STM32CUBEMX串口配置常见问题及解决方案(USART/printf重定向)
STM32CubeMX串口开发实战:从原理到调试的完整避坑手册 第一次在STM32CubeMX里配置串口时,我盯着那个115200的波特率数值发呆了十分钟——这个看似简单的数字背后,隐藏着多少新手会踩的坑?从时钟树配置到DMA缓冲区,从p…...
你好,放大器——失调与偏置的实战分析与优化策略
1. 放大器失调与偏置的真相大白 第一次用运放做电流检测电路时,我盯着输出端那0.5mV的"幽灵电压"百思不得其解——明明输入接地,输出却像闹鬼似的飘着电压。后来才发现,这其实是所有工程师都会遇到的经典问题:失调电压和…...
贾子科学定理(KST-C)自指闭合:硬度为王,悖论消解
贾子科学定理(KST-C)自指闭合:硬度为王,悖论消解摘要贾子科学定理(KST-C)以“可结构化”六维标准(符号化、公理化、逻辑推演、模型化、可嵌入、可计算)为核心,完成了对自…...
实习08-Mamba 和 SSM
🔹 第一部分:Mamba 基础概念(先补地基) 1.1 什么是 State Space Model (SSM)? [公式] - SSM 思想 SSM 源自控制理论,核心是一个连续时间系统: # 连续形式(控制理论) h(t)…...
新手必看!PyTorch 2.8镜像开箱即用,3步搞定CUDA环境配置
新手必看!PyTorch 2.8镜像开箱即用,3步搞定CUDA环境配置 1. 为什么选择PyTorch 2.8镜像? 深度学习环境配置一直是让新手头疼的问题,特别是CUDA驱动、cuDNN版本与PyTorch的兼容性问题。PyTorch 2.8镜像解决了这个痛点,…...
软件领域驱动设计管理中的领域层
软件领域驱动设计(DDD)中的领域层:业务逻辑的核心枢纽 在软件开发中,领域驱动设计(DDD)通过将复杂业务逻辑结构化,帮助团队更高效地构建可维护的系统。领域层作为DDD的核心,承载了业…...
