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

第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 错误处理原则

  1. 始终检查错误
  2. 只处理可以处理的错误
  3. 在合适的抽象层级传播错误
  4. 避免忽略错误
  5. 使用错误包装增加上下文信息

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章&#xff1a;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…...

题库刷题知识点总结

算法与机器学习相关 支持向量机&#xff1a;是一种有监督的机器学习算法&#xff0c;用于分类和回归任务。它通过寻找一个最优超平面来将不同类别的数据点分开&#xff0c;最大化两类数据点到超平面的间隔&#xff0c;具有良好的泛化能力和抗噪声能力。机器学习&#xff1a;是…...

GraphRAG:LLM之Graphrag接入milvus

前言 微软目前的graphrag更像个demo&#xff0c;数据量大的时候不是很友好的啊&#xff0c;所以将milvus接入了graphrag&#xff0c;看完这篇文章&#xff0c;其他数据库接入应该也没问题 注&#xff1a;这篇文章只是在search的时候接入进来&#xff0c;index过程或者说整个流…...

adb使用及常用命令

目录 介绍 组成 启用adb调试 常用命令 连接设备 版本信息 安装应用 卸载应用 文件操作 日志查看 屏幕截图和录制 设备重启 端口转发 调试相关 设置属性 设备信息查询 获取帮助 模拟输入 介绍 adb全称为 Android Debug Bridge(Android调试桥)&#xff0c;是 A…...

omnipeek分析beacon帧

omnipeek查询设备发送beacon时同一信道两个beacon发送间隔 目录 用例要求分析抓包数据 1.用例要求 Beacon帧发送频率符合规范要求。参数-【同一个信道两个beacon发送间隔不能超过100ms】 2.分析抓包数据 打开becon.pkt文件&#xff08;用omnipeek工具提前抓取包&#xff09…...

Java数组问题

题目2&#xff1a; 定义一个数组&#xff0c;存储1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8&#xff0c;9&#xff0c;10 遍历数组得到的每一个元素&#xff0c;统计数组里面一共多少个能被3整除的数字 package com.s…...

salesforce 可以为同一个简档的同一个 recordtype 的对象设置多种页面布局吗

在 Salesforce 中&#xff0c;对于同一个 Record Type&#xff08;记录类型&#xff09;&#xff0c;默认情况下&#xff0c;每个 Profile&#xff08;用户简档&#xff09; 只能分配一个 Page Layout&#xff08;页面布局&#xff09;。也就是说&#xff0c;页面布局的分配规则…...

使用vue项目中,使用webpack模板和直接用vue.config来配置相关插件 区别是什么,具体有哪些提现呢

在 Vue 项目中&#xff0c;使用 Webpack 模板 和 vue.config.js 来配置相关插件的主要区别在于配置的复杂度、灵活性和易用性。以下是两者的详细对比&#xff1a; 1. Webpack 模板 Webpack 模板是 Vue CLI 早期版本&#xff08;如 Vue CLI 2.x&#xff09;中提供的项目初始化模…...

五、包图

包图 、基本概念 概念&#xff1a; 用来描述模型中的包和其所含元素的组织方式的图&#xff0c;是维护和控制系统总体结构的重要内容。 包可以把所建立的各种模型组织起来&#xff0c;形成各种功能或用途的模块&#xff0c;并可以控制包中元素的可见性以及描述包之间的依赖…...

关于重构一点简单想法

关于重构一点简单想法 当前工作的组内&#xff0c;由于业务开启的时间正好处于集团php-》go技术栈全面迁移的时间点&#xff0c;组内语言技术栈存在&#xff1a;php、go两套。 因此需求开发过程中通常要考虑两套技术栈的逻辑&#xff0c;一些基础的逻辑也没有办法复用。 在这…...

kafka使用以及基于zookeeper集群搭建集群环境

一、环境介绍 zookeeper下载地址&#xff1a;https://zookeeper.apache.org/releases.html kafka下载地址&#xff1a;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的最优化问题是&#xff0c;本文记录如何求解这一问题。 首先为了表示方便&#xff0c;记&#xff0c;这里让最大的可视作常量。 第一步&#xff0c;给定初始的&#xff0c;使用梯度上升找到 ,最大化。关于梯度下降&#xff0c;可以参考笔者另一篇…...

并发线程(21)——线程池

文章目录 二十一、day211. 线程池实现1.1 完整代码1.2 解释 二十一、day21 我们之前在学习std::future、std::async、std::promise相关的知识时&#xff0c;通过std::promise和packaged_task构建了一个可用的线程池&#xff0c;可参考文章&#xff1a;并发编程&#xff08;6&a…...

基于32单片机的智能语音家居

一、主要功能介绍 以STM32F103C8T6单片机为控制核心&#xff0c;设计一款智能远程家电控制系统&#xff0c;该系统能实现如下功能&#xff1a; 1、可通过语音命令控制照明灯、空调、加热器、窗户及窗帘的开关&#xff1b; 2、可通过手机显示和控制照明灯、空调、窗户及窗帘的开…...

VScode怎么重启

原文链接&#xff1a;【vscode】vscode重新启动 键盘按下 Ctrl Shift p 打开命令行&#xff0c;如下图&#xff1a; 输入Reload Window&#xff0c;如下图&#xff1a;...

分析服务器 systemctl 启动gozero项目报错的解决方案

### 分析 systemctl start beisen.service 报错 在 Linux 系统中&#xff0c;systemctl 是管理系统和服务的主要工具。当我们尝试重启某个服务时&#xff0c;如果服务启动失败&#xff0c;systemctl 会输出错误信息&#xff0c;帮助我们诊断和解决问题。 本文将通过一个实际的…...

大模型LLM-Prompt-OPTIMAL

1 OPTIMAL OPTIMAL 具体每项内容解释如下&#xff1a; Objective Clarity&#xff08;目标清晰&#xff09;&#xff1a;明确定义任务的最终目标和预期成果。 Purpose Definition&#xff08;目的定义&#xff09;&#xff1a;阐述任务的目的和它的重要性。 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进行了优化&#xff0c;将wfms服务操作并入了workflow-server中&#xff0c;去除了原来的webservice服务调用形式&#xff0c;增加了并发处理&#xff0c;现在想测试模拟一下&#xff0c;在一…...

智能水文:ChatGPT等大语言模型如何提升水资源分析和模型优化的效率

大语言模型与水文水资源领域的融合具有多种具体应用&#xff0c;以下是一些主要的应用实例&#xff1a; 1、时间序列水文数据自动化处理及机器学习模型&#xff1a; ●自动分析流量或降雨量的异常值 ●参数估计&#xff0c;例如PIII型曲线的参数 ●自动分析降雨频率及重现期 ●…...

让机器学习势活过1000K——物理学告知的原子能量模型实现前所未有的模拟稳定性

来源&#xff1a;ScienceAI 本文约1500字&#xff0c;建议阅读5分钟从几何恢复到构象优化&#xff0c;全面验证物理信息力场。机器学习势&#xff08;MLP&#xff09;被誉为连接量子力学精度与分子力学效率的圣杯。过去二十年&#xff0c;它们已经能以前所未有的精度重现能量和…...

VMware Unlocker终极指南:3分钟在Windows/Linux上运行macOS虚拟机

VMware Unlocker终极指南&#xff1a;3分钟在Windows/Linux上运行macOS虚拟机 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker VMware Unlocker是一款革命性的开源工具&#xff0c;它能突破VMware对macO…...

Phi-4-mini-reasoning解决软件开发中的复杂依赖冲突问题

Phi-4-mini-reasoning解决软件开发中的复杂依赖冲突问题 1. 引言&#xff1a;依赖冲突的日常困扰 每个开发者都经历过这样的噩梦&#xff1a;项目跑得好好的&#xff0c;突然因为引入一个新库导致整个环境崩溃。控制台里密密麻麻的报错信息&#xff0c;像是一道无解的谜题。特…...

Go语言的sync.RWMutex表现真实

Go语言的sync.RWMutex表现真实 在并发编程中&#xff0c;锁机制是保证数据一致性的核心工具之一。Go语言的sync.RWMutex通过读写分离的设计&#xff0c;在高并发场景下表现出色&#xff0c;既提升了性能&#xff0c;又确保了线程安全。它的表现不仅体现在高效的锁竞争管理上&a…...

避坑指南:STM32CUBEMX串口配置常见问题及解决方案(USART/printf重定向)

STM32CubeMX串口开发实战&#xff1a;从原理到调试的完整避坑手册 第一次在STM32CubeMX里配置串口时&#xff0c;我盯着那个115200的波特率数值发呆了十分钟——这个看似简单的数字背后&#xff0c;隐藏着多少新手会踩的坑&#xff1f;从时钟树配置到DMA缓冲区&#xff0c;从p…...

你好,放大器——失调与偏置的实战分析与优化策略

1. 放大器失调与偏置的真相大白 第一次用运放做电流检测电路时&#xff0c;我盯着输出端那0.5mV的"幽灵电压"百思不得其解——明明输入接地&#xff0c;输出却像闹鬼似的飘着电压。后来才发现&#xff0c;这其实是所有工程师都会遇到的经典问题&#xff1a;失调电压和…...

贾子科学定理(KST-C)自指闭合:硬度为王,悖论消解

贾子科学定理&#xff08;KST-C&#xff09;自指闭合&#xff1a;硬度为王&#xff0c;悖论消解摘要贾子科学定理&#xff08;KST-C&#xff09;以“可结构化”六维标准&#xff08;符号化、公理化、逻辑推演、模型化、可嵌入、可计算&#xff09;为核心&#xff0c;完成了对自…...

实习08-Mamba 和 SSM

&#x1f539; 第一部分&#xff1a;Mamba 基础概念&#xff08;先补地基&#xff09; 1.1 什么是 State Space Model (SSM)&#xff1f; [公式] - SSM 思想 SSM 源自控制理论&#xff0c;核心是一个连续时间系统&#xff1a; # 连续形式&#xff08;控制理论&#xff09; h(t)…...

新手必看!PyTorch 2.8镜像开箱即用,3步搞定CUDA环境配置

新手必看&#xff01;PyTorch 2.8镜像开箱即用&#xff0c;3步搞定CUDA环境配置 1. 为什么选择PyTorch 2.8镜像&#xff1f; 深度学习环境配置一直是让新手头疼的问题&#xff0c;特别是CUDA驱动、cuDNN版本与PyTorch的兼容性问题。PyTorch 2.8镜像解决了这个痛点&#xff0c…...

软件领域驱动设计管理中的领域层

软件领域驱动设计&#xff08;DDD&#xff09;中的领域层&#xff1a;业务逻辑的核心枢纽 在软件开发中&#xff0c;领域驱动设计&#xff08;DDD&#xff09;通过将复杂业务逻辑结构化&#xff0c;帮助团队更高效地构建可维护的系统。领域层作为DDD的核心&#xff0c;承载了业…...